/// </summary>
Block current_block;
- BlockVariableDeclaration current_variable;
+ BlockVariable current_variable;
Delegate current_delegate;
//
LocationsBag lbag;
List<Tuple<Modifiers, Location>> mod_locations;
+ Stack<Location> location_stack;
%}
%token EOF
extern_alias_directive
: EXTERN_ALIAS IDENTIFIER IDENTIFIER SEMICOLON
{
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
string s = lt.Value;
if (s != "alias") {
syntax_error (lt.Location, "`alias' expected");
if (lang_version == LanguageVersion.ISO_1)
FeatureIsNotAvailable (lt.Location, "external alias");
- lt = (Tokenizer.LocatedToken) $3;
+ lt = (LocatedToken) $3;
if (lt.Value == QualifiedAliasMember.GlobalAlias) {
RootNamespace.Error_GlobalNamespaceRedefined (report, lt.Location);
}
}
| USING IDENTIFIER ASSIGN namespace_or_type_expr SEMICOLON
{
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
if (lang_version != LanguageVersion.ISO_1 && lt.Value == "global") {
report.Warning (440, 2, lt.Location,
"An alias named `global' will not be used when resolving `global::'. The global namespace will be used instead");
if (doc_support)
Lexer.doc_state = XmlCommentState.Allowed;
}
- opt_extern_alias_directives opt_using_directives opt_namespace_or_type_declarations CLOSE_BRACE opt_semicolon
+ opt_extern_alias_directives opt_using_directives opt_namespace_or_type_declarations CLOSE_BRACE opt_semicolon_error
{
if ($11 != null)
lbag.AddLocation (current_container, GetLocation ($2), GetLocation ($5), GetLocation ($10), GetLocation ($11));
current_container = current_namespace = current_namespace.Parent;
}
+ | opt_attributes NAMESPACE namespace_name
+ {
+ report.Error (1514, lexer.Location, "Unexpected symbol `{0}', expecting `.' or `{{'", GetSymbolName (yyToken));
+
+ var name = (MemberName) $3;
+ var ns = new NamespaceContainer (name, current_namespace);
+ lbag.AddLocation (ns, GetLocation ($2));
+ current_namespace.AddTypeContainer (ns);
+ }
+ ;
+
+opt_semicolon_error
+ : /* empty */
+ | SEMICOLON
+ | error
+ {
+ Error_SyntaxError (yyToken);
+ $$ = null;
+ }
;
namespace_name
: IDENTIFIER
{
- var lt = (Tokenizer.LocatedToken) $1;
+ var lt = (LocatedToken) $1;
$$ = new MemberName (lt.Value, lt.Location);
}
| namespace_name DOT IDENTIFIER
{
- var lt = (Tokenizer.LocatedToken) $3;
+ var lt = (LocatedToken) $3;
$$ = new MemberName ((MemberName) $1, lt.Value, lt.Location);
}
| error
attribute_section
: OPEN_BRACKET
{
+ PushLocation (GetLocation ($1));
lexer.parsing_attribute_section = true;
}
attribute_section_cont
$$ = new List<Attribute> (0);
else
$$ = $4;
-
+
+ lbag.InsertLocation ($$, 0, PopLocation ());
+ if ($5 != null) {
+ lbag.AddLocation ($$, GetLocation ($2), GetLocation ($5), GetLocation ($6));
+ } else {
+ lbag.AddLocation ($$, GetLocation ($2), GetLocation ($6));
+ }
+
current_attr_target = null;
lexer.parsing_attribute_section = false;
}
| attribute_list opt_comma CLOSE_BRACKET
{
$$ = $1;
+
+ lbag.InsertLocation ($$, 0, PopLocation ());
+ if ($2 != null) {
+ lbag.AddLocation ($$, GetLocation($2), GetLocation ($3));
+ } else {
+ lbag.AddLocation ($$, GetLocation($3));
+ }
+ }
+ | IDENTIFIER error
+ {
+ Error_SyntaxError (yyToken);
+
+ var lt = (LocatedToken) $1;
+ var tne = new SimpleName (lt.Value, null, lt.Location);
+
+ $$ = new List<Attribute> () {
+ new Attribute (null, tne, null, GetLocation ($1), false)
+ };
+ }
+ | error
+ {
+ $$ = CheckAttributeTarget (GetTokenName (yyToken), GetLocation ($1));
+ $$ = null;
}
;
attribute_target
: IDENTIFIER
{
- var lt = (Tokenizer.LocatedToken) $1;
+ var lt = (LocatedToken) $1;
$$ = CheckAttributeTarget (lt.Value, lt.Location);
}
| EVENT { $$ = "event"; }
| RETURN { $$ = "return"; }
- | error
- {
- if (yyToken == Token.IDENTIFIER) {
- Error_SyntaxError (yyToken);
- $$ = null;
- } else {
- string name = GetTokenName (yyToken);
- $$ = CheckAttributeTarget (name, GetLocation ($1));
- }
- }
;
attribute_list
| attribute_list COMMA attribute
{
var attrs = (List<Attribute>) $1;
- attrs.Add ((Attribute) $3);
+ if (attrs != null) {
+ attrs.Add ((Attribute) $3);
+ lbag.AppendTo (attrs, GetLocation ($2));
+ }
$$ = attrs;
}
$$ = new Argument ((Expression) $1);
}
| named_argument
+ | error
+ {
+ Error_SyntaxError (yyToken);
+ $$ = null;
+ }
;
named_attribute_argument
expression
{
--lexer.parsing_block;
- var lt = (Tokenizer.LocatedToken) $1;
+ var lt = (LocatedToken) $1;
$$ = new NamedArgument (lt.Value, lt.Location, (Expression) $4);
lbag.AddLocation ($$, GetLocation($2));
}
;
named_argument
- : identifier_inside_body COLON opt_named_modifier expression
+ : identifier_inside_body COLON opt_named_modifier expression_or_error
{
if (lang_version <= LanguageVersion.V_3)
FeatureIsNotAvailable (GetLocation ($1), "named argument");
// Avoid boxing in common case (no modifier)
var arg_mod = $3 == null ? Argument.AType.None : (Argument.AType) $3;
- var lt = (Tokenizer.LocatedToken) $1;
+ var lt = (LocatedToken) $1;
$$ = new NamedArgument (lt.Value, lt.Location, (Expression) $4, arg_mod);
lbag.AddLocation ($$, GetLocation($2));
}
| destructor_declaration
| type_declaration
| attributes_without_members
+ | incomplete_member
| error
{
report.Error (1519, lexer.Location, "Unexpected symbol `{0}' in class, struct, or interface member declaration",
GetSymbolName (yyToken));
$$ = null;
lexer.parsing_generic_declaration = false;
- }
+ }
;
struct_declaration
opt_partial
STRUCT
{
- lexer.ConstraintsParsing = true;
}
type_declaration_name
{
+ lexer.ConstraintsParsing = true;
push_current_container (new Struct (current_container, (MemberName) $6, (Modifiers) $2, (Attributes) $1), $3);
}
opt_class_base
opt_modifiers
CONST type IDENTIFIER
{
- var lt = (Tokenizer.LocatedToken) $5;
+ var lt = (LocatedToken) $5;
var mod = (Modifiers) $2;
current_field = new Const (current_type, (FullNamedExpression) $4, mod, new MemberName (lt.Value, lt.Location), (Attributes) $1);
current_type.AddMember (current_field);
lbag.AddMember (current_field, mod_locations, GetLocation ($3), GetLocation ($9));
current_field = null;
}
+ | opt_attributes
+ opt_modifiers
+ CONST type error
+ {
+ Error_SyntaxError (yyToken);
+
+ current_type.AddMember (new Const (current_type, (FullNamedExpression) $4, (Modifiers) $2, MemberName.Null, (Attributes) $1));
+ }
;
opt_constant_declarators
constant_declarator
: COMMA IDENTIFIER constant_initializer
{
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
$$ = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), (ConstInitializer) $3);
lbag.AddLocation ($$, GetLocation ($1));
}
if (type.Type != null && type.Type.Kind == MemberKind.Void)
report.Error (670, GetLocation ($3), "Fields cannot have void type");
- var lt = (Tokenizer.LocatedToken) $4;
+ var lt = (LocatedToken) $4;
current_field = new Field (current_type, type, (Modifiers) $2, new MemberName (lt.Value, lt.Location), (Attributes) $1);
current_type.AddField (current_field);
$$ = current_field;
if (lang_version < LanguageVersion.ISO_2)
FeatureIsNotAvailable (GetLocation ($3), "fixed size buffers");
- var lt = (Tokenizer.LocatedToken) $5;
+ var lt = (LocatedToken) $5;
current_field = new FixedField (current_type, (FullNamedExpression) $4, (Modifiers) $2,
new MemberName (lt.Value, lt.Location), (Attributes) $1);
field_declarator
: COMMA IDENTIFIER
{
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
$$ = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), null);
lbag.AddLocation ($$, GetLocation ($1));
}
variable_initializer
{
--lexer.parsing_block;
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
$$ = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), (Expression) $5);
lbag.AddLocation ($$, GetLocation ($1), GetLocation ($3));
}
fixed_field_declarator
: COMMA IDENTIFIER fixed_field_size
{
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
$$ = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), (ConstInitializer) $3);
lbag.AddLocation ($$, GetLocation ($1));
}
if (doc_support)
Lexer.doc_state = XmlCommentState.NotAllowed;
- // Add it early in the case of body being eof for full ast
- Method m = (Method) $1;
- async_block = (m.ModFlags & Modifiers.ASYNC) != 0;
- current_type.AddMember (m);
+ // Was added earlier in the case of body being eof for full ast
}
method_body
{
}
opt_formal_parameter_list CLOSE_PARENS
{
- lexer.ConstraintsParsing = true;
- }
- opt_type_parameter_constraints_clauses
- {
- lexer.ConstraintsParsing = false;
valid_param_mod = 0;
MemberName name = (MemberName) $4;
current_local_parameters = (ParametersCompiled) $7;
var method = Method.Create (current_type, (FullNamedExpression) $3, (Modifiers) $2,
- name, current_local_parameters, (Attributes) $1, $10 != null);
+ name, current_local_parameters, (Attributes) $1);
+
+ current_type.AddMember (method);
+
+ async_block = (method.ModFlags & Modifiers.ASYNC) != 0;
- if ($10 != null)
- method.SetConstraints ((List<Constraints>) $10);
-
if (doc_support)
method.DocComment = Lexer.consume_doc_comment ();
lbag.AddMember (method, mod_locations, GetLocation ($5), GetLocation ($8));
+
$$ = method;
+
+ lexer.ConstraintsParsing = true;
+ }
+ opt_type_parameter_constraints_clauses
+ {
+ lexer.ConstraintsParsing = false;
+
+ if ($10 != null) {
+ var method = (Method) $9;
+ method.SetConstraints ((List<Constraints>) $10);
+ }
+
+ $$ = $9;
}
| opt_attributes
opt_modifiers
modifiers |= Modifiers.PARTIAL;
var method = Method.Create (current_type, new TypeExpression (compiler.BuiltinTypes.Void, GetLocation ($4)),
- modifiers, name, current_local_parameters, (Attributes) $1, $11 != null);
+ modifiers, name, current_local_parameters, (Attributes) $1);
- if ($11 != null)
- method.SetConstraints ((List<Constraints>) $11);
+ current_type.AddMember (method);
+
+ async_block = (method.ModFlags & Modifiers.ASYNC) != 0;
+
+ if ($12 != null)
+ method.SetConstraints ((List<Constraints>) $12);
if (doc_support)
method.DocComment = Lexer.consume_doc_comment ();
"Member modifier `{0}' must precede the member type and name", ModifiersExtensions.Name ((Modifiers) $4));
var method = Method.Create (current_type, (FullNamedExpression) $3,
- 0, name, (ParametersCompiled) $7, (Attributes) $1, false);
+ 0, name, (ParametersCompiled) $7, (Attributes) $1);
+
+ current_type.AddMember (method);
current_local_parameters = (ParametersCompiled) $7;
MemberName name = (MemberName) $4;
var method = Method.Create (current_type, (FullNamedExpression) $3, (Modifiers) $2,
- name, current_local_parameters, (Attributes) $1, false);
+ name, current_local_parameters, (Attributes) $1);
+
+ current_type.AddMember (method);
if (doc_support)
method.DocComment = Lexer.consume_doc_comment ();
: opt_attributes
opt_parameter_modifier
parameter_type
- IDENTIFIER
+ identifier_inside_body
{
- var lt = (Tokenizer.LocatedToken) $4;
+ var lt = (LocatedToken) $4;
$$ = new Parameter ((FullNamedExpression) $3, lt.Value, (Parameter.Modifier) $2, (Attributes) $1, lt.Location);
}
| opt_attributes
opt_parameter_modifier
parameter_type
- IDENTIFIER OPEN_BRACKET CLOSE_BRACKET
+ identifier_inside_body OPEN_BRACKET CLOSE_BRACKET
{
- var lt = (Tokenizer.LocatedToken) $4;
+ var lt = (LocatedToken) $4;
report.Error (1552, lt.Location, "Array type specifier, [], must appear before parameter name");
$$ = new Parameter ((FullNamedExpression) $3, lt.Value, (Parameter.Modifier) $2, (Attributes) $1, lt.Location);
}
| opt_attributes
opt_parameter_modifier
parameter_type
- IDENTIFIER
+ identifier_inside_body
ASSIGN
{
++lexer.parsing_block;
if ((valid_param_mod & ParameterModifierType.DefaultValue) == 0)
report.Error (1065, GetLocation ($5), "Optional parameter is not valid in this context");
- var lt = (Tokenizer.LocatedToken) $4;
+ var lt = (LocatedToken) $4;
$$ = new Parameter ((FullNamedExpression) $3, lt.Value, mod, (Attributes) $1, lt.Location);
lbag.AddLocation ($$, GetLocation ($5));
parameter_array
: opt_attributes params_modifier type IDENTIFIER
{
- var lt = (Tokenizer.LocatedToken) $4;
+ var lt = (LocatedToken) $4;
$$ = new ParamsParameter ((FullNamedExpression) $3, lt.Value, (Attributes) $1, lt.Location);
}
| opt_attributes params_modifier type IDENTIFIER ASSIGN constant_expression
{
report.Error (1751, GetLocation ($2), "Cannot specify a default value for a parameter array");
- var lt = (Tokenizer.LocatedToken) $4;
+ var lt = (LocatedToken) $4;
$$ = new ParamsParameter ((FullNamedExpression) $3, lt.Value, (Attributes) $1, lt.Location);
}
| opt_attributes params_modifier type error
{
Error_SyntaxError (yyToken);
- $$ = null;
+
+ $$ = new ParamsParameter ((FullNamedExpression) $3, null, (Attributes) $1, Location.Null);
}
;
{
valid_param_mod = ParameterModifierType.Params | ParameterModifierType.DefaultValue;
}
- opt_formal_parameter_list CLOSE_BRACKET OPEN_BRACE
+ opt_formal_parameter_list CLOSE_BRACKET
{
valid_param_mod = 0;
var type = (FullNamedExpression) $3;
current_property = indexer;
current_type.AddIndexer (indexer);
- lbag.AddMember (current_property, mod_locations, GetLocation ($5), GetLocation ($8), GetLocation ($9));
+ lbag.AddMember (current_property, mod_locations, GetLocation ($5), GetLocation ($8));
if (type.Type != null && type.Type.Kind == MemberKind.Void)
report.Error (620, GetLocation ($3), "`{0}': indexer return type cannot be `void'", indexer.GetSignatureForError ());
lexer.PropertyParsing = true;
}
- accessor_declarations
+ OPEN_BRACE accessor_declarations
{
lexer.PropertyParsing = false;
}
if (doc_support)
current_property.DocComment = ConsumeStoredComment ();
- lbag.AppendToMember (current_property, GetLocation ($12));
+ lbag.AppendToMember (current_property, GetLocation ($10), GetLocation ($13));
current_property = null;
}
;
opt_partial
INTERFACE
{
- lexer.ConstraintsParsing = true;
}
type_declaration_name
{
+ lexer.ConstraintsParsing = true;
push_current_container (new Interface (current_container, (MemberName) $6, (Modifiers) $2, (Attributes) $1), $3);
lbag.AddMember (current_container, mod_locations, GetLocation ($4));
}
Operator.GetName (op));
}
} else {
- if (p_count > 2) {
+ if (p_count == 1) {
+ report.Error (1019, loc, "Overloadable unary operator expected");
+ } else if (p_count != 2) {
report.Error (1534, loc, "Overloaded binary operator `{0}' takes two parameters",
Operator.GetName (op));
- } else if (p_count != 2) {
- report.Error (1019, loc, "Overloadable unary operator expected");
}
}
Location loc = GetLocation ($2);
current_local_parameters = (ParametersCompiled)$6;
-
+
+ if (current_local_parameters.Count != 1) {
+ report.Error (1535, loc, "Overloaded unary operator `implicit' takes one parameter");
+ }
+
if (doc_support) {
tmpComment = Lexer.consume_doc_comment ();
Lexer.doc_state = XmlCommentState.NotAllowed;
Location loc = GetLocation ($2);
current_local_parameters = (ParametersCompiled)$6;
-
+
+ if (current_local_parameters.Count != 1) {
+ report.Error (1535, loc, "Overloaded unary operator `explicit' takes one parameter");
+ }
+
if (doc_support) {
tmpComment = Lexer.consume_doc_comment ();
Lexer.doc_state = XmlCommentState.NotAllowed;
valid_param_mod = 0;
current_local_parameters = (ParametersCompiled) $6;
- var lt = (Tokenizer.LocatedToken) $3;
+ var lt = (LocatedToken) $3;
var mods = (Modifiers) $2;
var c = new Constructor (current_type, lt.Value, mods, (Attributes) $1, current_local_parameters, lt.Location);
}
IDENTIFIER OPEN_PARENS CLOSE_PARENS method_body
{
- var lt = (Tokenizer.LocatedToken) $5;
+ var lt = (LocatedToken) $5;
if (lt.Value != current_container.MemberName.Name){
report.Error (574, lt.Location, "Name of destructor must match name of class");
} else if (current_container.Kind != MemberKind.Class){
current_event = null;
current_local_parameters = null;
}
+ | opt_attributes
+ opt_modifiers
+ EVENT type error
+ {
+ Error_SyntaxError (yyToken);
+
+ current_type.AddMember (new EventField (current_type, (FullNamedExpression) $4, (Modifiers) $2, MemberName.Null, (Attributes) $1));
+ }
;
opt_event_initializer
event_declarator
: COMMA IDENTIFIER
{
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
$$ = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), null);
lbag.AddLocation ($$, GetLocation ($1));
}
event_variable_initializer
{
--lexer.parsing_block;
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
$$ = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), (Expression) $5);
lbag.AddLocation ($$, GetLocation ($1), GetLocation ($3));
}
lexer.putback ('}');
}
;
+
+// For full ast try to recover incomplete ambiguous member
+// declaration in form on class X { public int }
+incomplete_member
+ : opt_attributes opt_modifiers member_type CLOSE_BRACE
+ {
+ report.Error (1519, lexer.Location, "Unexpected symbol `}' in class, struct, or interface member declaration");
+
+ lexer.putback ('}');
+
+ lexer.parsing_generic_declaration = false;
+ FullNamedExpression type = (FullNamedExpression) $3;
+ current_field = new Field (current_type, type, (Modifiers) $2, MemberName.Null, (Attributes) $1);
+ current_type.AddField (current_field);
+ $$ = current_field;
+ }
+ ;
enum_declaration
: opt_attributes
enum_member_declaration
: opt_attributes IDENTIFIER
{
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
var em = new EnumMember ((Enum) current_type, new MemberName (lt.Value, lt.Location), (Attributes) $1);
((Enum) current_type).AddEnumMember (em);
{
--lexer.parsing_block;
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
var em = new EnumMember ((Enum) current_type, new MemberName (lt.Value, lt.Location), (Attributes) $1);
em.Initializer = new ConstInitializer (em, (Expression) $5, GetLocation ($4));
((Enum) current_type).AddEnumMember (em);
{
Error_SyntaxError (yyToken);
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
var em = new EnumMember ((Enum) current_type, new MemberName (lt.Value, lt.Location), (Attributes) $1);
((Enum) current_type).AddEnumMember (em);
: member_name
| qualified_alias_member IDENTIFIER opt_type_argument_list
{
- var lt1 = (Tokenizer.LocatedToken) $1;
- var lt2 = (Tokenizer.LocatedToken) $2;
+ var lt1 = (LocatedToken) $1;
+ var lt2 = (LocatedToken) $2;
$$ = new QualifiedAliasMember (lt1.Value, lt2.Value, (TypeArguments) $3, lt1.Location);
lbag.AddLocation ($$, GetLocation ($2));
: simple_name_expr
| namespace_or_type_expr DOT IDENTIFIER opt_type_argument_list
{
- var lt = (Tokenizer.LocatedToken) $3;
+ var lt = (LocatedToken) $3;
$$ = new MemberAccess ((Expression) $1, lt.Value, (TypeArguments) $4, lt.Location);
lbag.AddLocation ($$, GetLocation ($2));
}
simple_name_expr
: IDENTIFIER opt_type_argument_list
{
- var lt = (Tokenizer.LocatedToken) $1;
+ var lt = (LocatedToken) $1;
$$ = new SimpleName (lt.Value, (TypeArguments)$2, lt.Location);
}
;
opt_type_parameter_list
{
lexer.parsing_generic_declaration = false;
- var lt = (Tokenizer.LocatedToken) $1;
+ var lt = (LocatedToken) $1;
$$ = new MemberName (lt.Value, (TypeParameters)$3, lt.Location);
}
;
| explicit_interface IDENTIFIER opt_type_parameter_list
{
lexer.parsing_generic_declaration = false;
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
$$ = new MemberName (lt.Value, (TypeParameters) $3, (ATypeNameExpression) $1, lt.Location);
}
;
explicit_interface
: IDENTIFIER opt_type_argument_list DOT
{
- var lt = (Tokenizer.LocatedToken) $1;
+ var lt = (LocatedToken) $1;
$$ = new SimpleName (lt.Value, (TypeArguments) $2, lt.Location);
lbag.AddLocation ($$, GetLocation ($3));
}
| qualified_alias_member IDENTIFIER opt_type_argument_list DOT
{
- var lt1 = (Tokenizer.LocatedToken) $1;
- var lt2 = (Tokenizer.LocatedToken) $2;
+ var lt1 = (LocatedToken) $1;
+ var lt2 = (LocatedToken) $2;
$$ = new QualifiedAliasMember (lt1.Value, lt2.Value, (TypeArguments) $3, lt1.Location);
lbag.AddLocation ($$, GetLocation ($4));
}
| explicit_interface IDENTIFIER opt_type_argument_list DOT
{
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
$$ = new MemberAccess ((ATypeNameExpression) $1, lt.Value, (TypeArguments) $3, lt.Location);
lbag.AddLocation ($$, GetLocation ($4));
}
type_parameter
: opt_attributes opt_type_parameter_variance IDENTIFIER
{
- var lt = (Tokenizer.LocatedToken)$3;
+ var lt = (LocatedToken)$3;
$$ = new TypeParameter (new MemberName (lt.Value, lt.Location), (Attributes)$1, (Variance) $2);
}
| error
primary_expression_or_type
: IDENTIFIER opt_type_argument_list
{
- var lt = (Tokenizer.LocatedToken) $1;
+ var lt = (LocatedToken) $1;
$$ = new SimpleName (lt.Value, (TypeArguments)$2, lt.Location);
}
| IDENTIFIER GENERATE_COMPLETION {
- var lt = (Tokenizer.LocatedToken) $1;
+ var lt = (LocatedToken) $1;
$$ = new CompletionSimpleName (MemberName.MakeName (lt.Value, null), lt.Location);
}
| member_access
parenthesized_expression
: OPEN_PARENS expression CLOSE_PARENS
{
- $$ = new ParenthesizedExpression ((Expression) $2);
+ $$ = new ParenthesizedExpression ((Expression) $2, GetLocation ($1));
lbag.AddLocation ($$, GetLocation ($1), GetLocation ($3));
}
| OPEN_PARENS expression COMPLETE_COMPLETION
{
- $$ = new ParenthesizedExpression ((Expression) $2);
+ $$ = new ParenthesizedExpression ((Expression) $2, GetLocation ($1));
}
;
member_access
- : primary_expression DOT IDENTIFIER opt_type_argument_list
+ : primary_expression DOT identifier_inside_body opt_type_argument_list
{
- var lt = (Tokenizer.LocatedToken) $3;
+ var lt = (LocatedToken) $3;
$$ = new MemberAccess ((Expression) $1, lt.Value, (TypeArguments) $4, lt.Location);
lbag.AddLocation ($$, GetLocation ($2));
}
- | builtin_types DOT IDENTIFIER opt_type_argument_list
+ | builtin_types DOT identifier_inside_body opt_type_argument_list
{
- var lt = (Tokenizer.LocatedToken) $3;
+ var lt = (LocatedToken) $3;
$$ = new MemberAccess ((Expression) $1, lt.Value, (TypeArguments) $4, lt.Location);
lbag.AddLocation ($$, GetLocation ($2));
}
- | BASE DOT IDENTIFIER opt_type_argument_list
+ | BASE DOT identifier_inside_body opt_type_argument_list
{
- var lt = (Tokenizer.LocatedToken) $3;
+ var lt = (LocatedToken) $3;
$$ = new MemberAccess (new BaseThis (GetLocation ($1)), lt.Value, (TypeArguments) $4, lt.Location);
lbag.AddLocation ($$, GetLocation ($2));
}
- | qualified_alias_member IDENTIFIER opt_type_argument_list
+ | qualified_alias_member identifier_inside_body opt_type_argument_list
{
- var lt1 = (Tokenizer.LocatedToken) $1;
- var lt2 = (Tokenizer.LocatedToken) $2;
+ var lt1 = (LocatedToken) $1;
+ var lt2 = (LocatedToken) $2;
$$ = new QualifiedAliasMember (lt1.Value, lt2.Value, (TypeArguments) $3, lt1.Location);
lbag.AddLocation ($$, GetLocation ($2));
$$ = new CompletionMemberAccess ((Expression) $1, null,GetLocation ($3));
}
| primary_expression DOT IDENTIFIER GENERATE_COMPLETION {
- var lt = (Tokenizer.LocatedToken) $3;
+ var lt = (LocatedToken) $3;
$$ = new CompletionMemberAccess ((Expression) $1, lt.Value, lt.Location);
}
| builtin_types DOT GENERATE_COMPLETION
$$ = new CompletionMemberAccess ((Expression) $1, null, lexer.Location);
}
| builtin_types DOT IDENTIFIER GENERATE_COMPLETION {
- var lt = (Tokenizer.LocatedToken) $3;
+ var lt = (LocatedToken) $3;
$$ = new CompletionMemberAccess ((Expression) $1, lt.Value, lt.Location);
}
;
$$ = new Invocation ((Expression) $1, (Arguments) $3);
lbag.AddLocation ($$, GetLocation ($2));
}
-
+ | primary_expression open_parens_any error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Invocation ((Expression) $1, null);
+ lbag.AddLocation ($$, GetLocation ($2));
+ }
;
opt_object_or_collection_initializer
: OPEN_BRACE opt_member_initializer_list close_brace_or_complete_completion
{
if ($2 == null) {
- $$ = CollectionOrObjectInitializers.Empty;
- // TODO: lbag
+ $$ = new CollectionOrObjectInitializers (GetLocation ($1));
} else {
$$ = new CollectionOrObjectInitializers ((List<Expression>) $2, GetLocation ($1));
- lbag.AddLocation ($$, GetLocation ($3));
}
+ lbag.AddLocation ($$, GetLocation ($3));
}
| OPEN_BRACE member_initializer_list COMMA CLOSE_BRACE
{
member_initializer
: IDENTIFIER ASSIGN initializer_value
{
- var lt = (Tokenizer.LocatedToken) $1;
+ var lt = (LocatedToken) $1;
+ $$ = new ElementInitializer (lt.Value, (Expression)$3, lt.Location);
+ lbag.AddLocation ($$, GetLocation ($2));
+ }
+ | AWAIT ASSIGN initializer_value
+ {
+ var lt = (LocatedToken) Error_AwaitAsIdentifier ($1);
$$ = new ElementInitializer (lt.Value, (Expression)$3, lt.Location);
lbag.AddLocation ($$, GetLocation ($2));
}
{
report.Error (1920, GetLocation ($1), "An element initializer cannot be empty");
$$ = null;
- }
+ }
;
initializer_value
}
| argument_list COMMA error
{
- lexer.putback (')'); // TODO: Wrong but what can I do
+ if (lexer.putback_char == -1)
+ lexer.putback (')'); // TODO: Wrong but what can I do
Error_SyntaxError (yyToken);
$$ = $1;
}
;
expression_list
- : expression
+ : expression_or_error
{
var list = new List<Expression> (4);
list.Add ((Expression) $1);
$$ = list;
}
- | expression_list COMMA expression
+ | expression_list COMMA expression_or_error
{
var list = (List<Expression>) $1;
list.Add ((Expression) $3);
$$ = list;
}
- | expression_list error {
- Error_SyntaxError (yyToken);
- $$ = $1;
- }
;
expression_list_arguments
;
anonymous_type_parameter
- : IDENTIFIER ASSIGN variable_initializer
+ : identifier_inside_body ASSIGN variable_initializer
{
- var lt = (Tokenizer.LocatedToken)$1;
+ var lt = (LocatedToken)$1;
$$ = new AnonymousTypeParameter ((Expression)$3, lt.Value, lt.Location);
lbag.AddLocation ($$, GetLocation ($2));
}
- | IDENTIFIER
+ | identifier_inside_body
{
- var lt = (Tokenizer.LocatedToken)$1;
+ var lt = (LocatedToken)$1;
$$ = new AnonymousTypeParameter (new SimpleName (lt.Value, lt.Location),
lt.Value, lt.Location);
}
unbound_type_name
: identifier_inside_body generic_dimension
{
- var lt = (Tokenizer.LocatedToken) $1;
+ var lt = (LocatedToken) $1;
$$ = new SimpleName (lt.Value, (int) $2, lt.Location);
}
| qualified_alias_member identifier_inside_body generic_dimension
{
- var lt1 = (Tokenizer.LocatedToken) $1;
- var lt2 = (Tokenizer.LocatedToken) $2;
+ var lt1 = (LocatedToken) $1;
+ var lt2 = (LocatedToken) $2;
$$ = new QualifiedAliasMember (lt1.Value, lt2.Value, (int) $3, lt1.Location);
lbag.AddLocation ($$, GetLocation ($2));
}
| unbound_type_name DOT identifier_inside_body
{
- var lt = (Tokenizer.LocatedToken) $3;
+ var lt = (LocatedToken) $3;
$$ = new MemberAccess ((Expression) $1, lt.Value, lt.Location);
}
| unbound_type_name DOT identifier_inside_body generic_dimension
{
- var lt = (Tokenizer.LocatedToken) $3;
+ var lt = (LocatedToken) $3;
$$ = new MemberAccess ((Expression) $1, lt.Value, (int) $4, lt.Location);
}
if (tne.HasTypeArguments)
Error_TypeExpected (GetLocation ($4));
- var lt = (Tokenizer.LocatedToken) $3;
+ var lt = (LocatedToken) $3;
$$ = new MemberAccess (tne, lt.Value, (int) $4, lt.Location);
}
;
qualified_alias_member
: IDENTIFIER DOUBLE_COLON
{
- var lt = (Tokenizer.LocatedToken) $1;
+ var lt = (LocatedToken) $1;
if (lang_version == LanguageVersion.ISO_1)
FeatureIsNotAvailable (lt.Location, "namespace alias qualifier");
$$ = new SizeOf ((Expression) $3, GetLocation ($1));
lbag.AddLocation ($$, GetLocation ($2), GetLocation ($4));
}
+ | SIZEOF open_parens_any type error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new SizeOf ((Expression) $3, GetLocation ($1));
+ lbag.AddLocation ($$, GetLocation ($2));
+ }
;
checked_expression
$$ = new CheckedExpr ((Expression) $3, GetLocation ($1));
lbag.AddLocation ($$, GetLocation ($2), GetLocation ($4));
}
+ | CHECKED error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new CheckedExpr (null, GetLocation ($1));
+ }
;
unchecked_expression
$$ = new UnCheckedExpr ((Expression) $3, GetLocation ($1));
lbag.AddLocation ($$, GetLocation ($2), GetLocation ($4));
}
+ | UNCHECKED error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new UnCheckedExpr (null, GetLocation ($1));
+ }
;
pointer_member_access
: primary_expression OP_PTR IDENTIFIER opt_type_argument_list
{
- var lt = (Tokenizer.LocatedToken) $3;
+ var lt = (LocatedToken) $3;
$$ = new MemberAccess (new Indirection ((Expression) $1, GetLocation ($2)), lt.Value, (TypeArguments) $4, lt.Location);
}
;
$$ = new Await ((Expression) $2, GetLocation ($1));
}
+ | BANG error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Unary (Unary.Operator.LogicalNot, null, GetLocation ($1));
+ }
+ | TILDE error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Unary (Unary.Operator.OnesComplement, null, GetLocation ($1));
+ }
+ | OPEN_PARENS_CAST type CLOSE_PARENS error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Cast ((FullNamedExpression) $2, null, GetLocation ($1));
+ lbag.AddLocation ($$, GetLocation ($3));
+ }
+ | AWAIT error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Await (null, GetLocation ($1));
+ }
;
//
{
$$ = new Unary (Unary.Operator.AddressOf, (Expression) $2, GetLocation ($1));
}
+ | PLUS error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Unary (Unary.Operator.UnaryPlus, null, GetLocation ($1));
+ }
+ | MINUS error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Unary (Unary.Operator.UnaryNegation, null, GetLocation ($1));
+ }
+ | OP_INC error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new UnaryMutator (UnaryMutator.Mode.PreIncrement, null, GetLocation ($1));
+ }
+ | OP_DEC error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new UnaryMutator (UnaryMutator.Mode.PreDecrement, null, GetLocation ($1));
+ }
+ | STAR error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Indirection (null, GetLocation ($1));
+ }
+ | BITWISE_AND error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Unary (Unary.Operator.AddressOf, null, GetLocation ($1));
+ }
;
multiplicative_expression
$$ = new Binary (Binary.Operator.Modulus, (Expression) $1, (Expression) $3);
lbag.AddLocation ($$, GetLocation ($2));
}
+ | multiplicative_expression STAR error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Binary (Binary.Operator.Multiply, (Expression) $1, null);
+ lbag.AddLocation ($$, GetLocation ($2));
+ }
+ | multiplicative_expression DIV error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Binary (Binary.Operator.Division, (Expression) $1, null);
+ lbag.AddLocation ($$, GetLocation ($2));
+ }
+ | multiplicative_expression PERCENT error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Binary (Binary.Operator.Modulus, (Expression) $1, null);
+ lbag.AddLocation ($$, GetLocation ($2));
+ }
;
additive_expression
{
$$ = new Is ((Expression) $1, (Expression) $3, GetLocation ($2));
}
+ | additive_expression PLUS error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Binary (Binary.Operator.Addition, (Expression) $1, null);
+ lbag.AddLocation ($$, GetLocation ($2));
+ }
+ | additive_expression MINUS error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Binary (Binary.Operator.Subtraction, (Expression) $1, null);
+ lbag.AddLocation ($$, GetLocation ($2));
+ }
+ | additive_expression AS error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new As ((Expression) $1, null, GetLocation ($2));
+ }
+ | additive_expression IS error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Is ((Expression) $1, null, GetLocation ($2));
+ }
;
shift_expression
$$ = new Binary (Binary.Operator.RightShift, (Expression) $1, (Expression) $3);
lbag.AddLocation ($$, GetLocation ($2));
}
+ | shift_expression OP_SHIFT_LEFT error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Binary (Binary.Operator.LeftShift, (Expression) $1, null);
+ lbag.AddLocation ($$, GetLocation ($2));
+ }
+ | shift_expression OP_SHIFT_RIGHT error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Binary (Binary.Operator.RightShift, (Expression) $1, null);
+ lbag.AddLocation ($$, GetLocation ($2));
+ }
;
relational_expression
$$ = new Binary (Binary.Operator.GreaterThanOrEqual, (Expression) $1, (Expression) $3);
lbag.AddLocation ($$, GetLocation ($2));
}
+ | relational_expression OP_LT error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Binary (Binary.Operator.LessThan, (Expression) $1, null);
+ lbag.AddLocation ($$, GetLocation ($2));
+ }
+ | relational_expression OP_GT error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Binary (Binary.Operator.GreaterThan, (Expression) $1, null);
+ lbag.AddLocation ($$, GetLocation ($2));
+ }
+ | relational_expression OP_LE error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Binary (Binary.Operator.LessThanOrEqual, (Expression) $1, null);
+ lbag.AddLocation ($$, GetLocation ($2));
+ }
+ | relational_expression OP_GE error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Binary (Binary.Operator.GreaterThanOrEqual, (Expression) $1, null);
+ lbag.AddLocation ($$, GetLocation ($2));
+ }
;
equality_expression
$$ = new Binary (Binary.Operator.Inequality, (Expression) $1, (Expression) $3);
lbag.AddLocation ($$, GetLocation ($2));
}
+ | equality_expression OP_EQ error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Binary (Binary.Operator.Equality, (Expression) $1, null);
+ lbag.AddLocation ($$, GetLocation ($2));
+ }
+ | equality_expression OP_NE error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Binary (Binary.Operator.Inequality, (Expression) $1, null);
+ lbag.AddLocation ($$, GetLocation ($2));
+ }
;
and_expression
$$ = new Binary (Binary.Operator.BitwiseAnd, (Expression) $1, (Expression) $3);
lbag.AddLocation ($$, GetLocation ($2));
}
+ | and_expression BITWISE_AND error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Binary (Binary.Operator.BitwiseAnd, (Expression) $1, null);
+ lbag.AddLocation ($$, GetLocation ($2));
+ }
;
exclusive_or_expression
$$ = new Binary (Binary.Operator.ExclusiveOr, (Expression) $1, (Expression) $3);
lbag.AddLocation ($$, GetLocation ($2));
}
+ | exclusive_or_expression CARRET error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Binary (Binary.Operator.ExclusiveOr, (Expression) $1, null);
+ lbag.AddLocation ($$, GetLocation ($2));
+ }
;
inclusive_or_expression
$$ = new Binary (Binary.Operator.BitwiseOr, (Expression) $1, (Expression) $3);
lbag.AddLocation ($$, GetLocation ($2));
}
+ | inclusive_or_expression BITWISE_OR error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Binary (Binary.Operator.BitwiseOr, (Expression) $1, null);
+ lbag.AddLocation ($$, GetLocation ($2));
+ }
;
conditional_and_expression
$$ = new Binary (Binary.Operator.LogicalAnd, (Expression) $1, (Expression) $3);
lbag.AddLocation ($$, GetLocation ($2));
}
+ | conditional_and_expression OP_AND error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Binary (Binary.Operator.LogicalAnd, (Expression) $1, null);
+ lbag.AddLocation ($$, GetLocation ($2));
+ }
;
conditional_or_expression
$$ = new Binary (Binary.Operator.LogicalOr, (Expression) $1, (Expression) $3);
lbag.AddLocation ($$, GetLocation ($2));
}
+ | conditional_or_expression OP_OR error
+ {
+ Error_SyntaxError (yyToken);
+
+ $$ = new Binary (Binary.Operator.LogicalOr, (Expression) $1, null);
+ lbag.AddLocation ($$, GetLocation ($2));
+ }
;
null_coalescing_expression
conditional_expression
: null_coalescing_expression
- | null_coalescing_expression INTERR expression COLON expression_or_error
+ | null_coalescing_expression INTERR expression COLON expression
{
$$ = new Conditional (new BooleanExpression ((Expression) $1), (Expression) $3, (Expression) $5, GetLocation ($2));
lbag.AddLocation ($$, GetLocation ($4));
| null_coalescing_expression INTERR expression error
{
Error_SyntaxError (yyToken);
+
+ $$ = new Conditional (new BooleanExpression ((Expression) $1), (Expression) $3, null, GetLocation ($2));
+ }
+ | null_coalescing_expression INTERR expression COLON error
+ {
+ Error_SyntaxError (yyToken);
+
$$ = new Conditional (new BooleanExpression ((Expression) $1), (Expression) $3, null, GetLocation ($2));
+ lbag.AddLocation ($$, GetLocation ($4));
+ }
+ | null_coalescing_expression INTERR expression COLON CLOSE_BRACE
+ {
+ Error_SyntaxError (Token.CLOSE_BRACE);
+
+ $$ = new Conditional (new BooleanExpression ((Expression) $1), (Expression) $3, null, GetLocation ($2));
+ lbag.AddLocation ($$, GetLocation ($4));
+ lexer.putback ('}');
}
;
lambda_parameter
: parameter_modifier parameter_type identifier_inside_body
{
- var lt = (Tokenizer.LocatedToken) $3;
+ var lt = (LocatedToken) $3;
$$ = new Parameter ((FullNamedExpression) $2, lt.Value, (Parameter.Modifier) $1, null, lt.Location);
}
| parameter_type identifier_inside_body
{
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
$$ = new Parameter ((FullNamedExpression) $1, lt.Value, Parameter.Modifier.NONE, null, lt.Location);
}
| IDENTIFIER
{
- var lt = (Tokenizer.LocatedToken) $1;
+ var lt = (LocatedToken) $1;
+ $$ = new ImplicitLambdaParameter (lt.Value, lt.Location);
+ }
+ | AWAIT
+ {
+ var lt = (LocatedToken) Error_AwaitAsIdentifier ($1);
$$ = new ImplicitLambdaParameter (lt.Value, lt.Location);
}
;
;
lambda_expression_body
- : lambda_expression_body_simple
- | block
- ;
-
-lambda_expression_body_simple
: {
start_block (Location.Null);
}
- expression_or_error // Have to close block when error occurs
+ expression // All expressions must handle error or current block won't be restored and breaking ast completely
{
Block b = end_block (Location.Null);
b.IsCompilerGenerated = true;
b.AddStatement (new ContextualReturn ((Expression) $2));
$$ = b;
}
+ | block
+ | error
+ {
+ // Handles only cases like foo = x.FirstOrDefault (l => );
+ // where we must restore current_variable
+ Block b = end_block (Location.Null);
+ b.IsCompilerGenerated = true;
+
+ Error_SyntaxError (yyToken);
+ $$ = null;
+ }
;
-
+
expression_or_error
: expression
| error
{
- Error_SyntaxError (yyToken);
- $$ = EmptyExpression.Null;
+ Error_SyntaxError (yyToken);
+ $$ = null;
}
;
-
+
lambda_expression
: IDENTIFIER ARROW
{
- var lt = (Tokenizer.LocatedToken) $1;
+ var lt = (LocatedToken) $1;
+ Parameter p = new ImplicitLambdaParameter (lt.Value, lt.Location);
+ start_anonymous (true, new ParametersCompiled (p), false, lt.Location);
+ }
+ lambda_expression_body
+ {
+ $$ = end_anonymous ((ParametersBlock) $4);
+ lbag.AddLocation ($$, GetLocation ($2));
+ }
+ | AWAIT ARROW
+ {
+ var lt = (LocatedToken) Error_AwaitAsIdentifier ($1);
Parameter p = new ImplicitLambdaParameter (lt.Value, lt.Location);
start_anonymous (true, new ParametersCompiled (p), false, lt.Location);
}
}
| ASYNC identifier_inside_body ARROW
{
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
Parameter p = new ImplicitLambdaParameter (lt.Value, lt.Location);
start_anonymous (true, new ParametersCompiled (p), true, lt.Location);
}
opt_partial
CLASS
{
- lexer.ConstraintsParsing = true;
}
type_declaration_name
{
+ lexer.ConstraintsParsing = true;
+
Class c = new Class (current_container, (MemberName) $6, (Modifiers) $2, (Attributes) $1);
if (((c.ModFlags & Modifiers.STATIC) != 0) && lang_version == LanguageVersion.ISO_1) {
FeatureIsNotAvailable (c.Location, "static classes");
: /* empty */
| COLON type_list
{
- current_type.AddBasesForPart ((List<FullNamedExpression>) $2);
+ current_type.SetBaseTypes ((List<FullNamedExpression>) $2);
}
| COLON type_list error
{
Error_SyntaxError (yyToken);
- current_type.AddBasesForPart ((List<FullNamedExpression>) $2);
+ current_type.SetBaseTypes ((List<FullNamedExpression>) $2);
}
;
type_parameter_constraints_clause
: WHERE IDENTIFIER COLON type_parameter_constraints
{
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
$$ = new Constraints (new SimpleMemberName (lt.Value, lt.Location), (List<FullNamedExpression>) $4, GetLocation ($1));
lbag.AddLocation ($$, GetLocation ($3));
}
{
Error_SyntaxError (yyToken);
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
$$ = new Constraints (new SimpleMemberName (lt.Value, lt.Location), null, GetLocation ($1));
}
;
labeled_statement
: identifier_inside_body COLON
{
- var lt = (Tokenizer.LocatedToken) $1;
+ var lt = (LocatedToken) $1;
LabeledStatement labeled = new LabeledStatement (lt.Value, current_block, lt.Location);
lbag.AddLocation (labeled, GetLocation ($2));
current_block.AddLabel (labeled);
: IDENTIFIER
| AWAIT
{
- if (async_block) {
- report.Error (4003, GetLocation ($1), "`await' cannot be used as an identifier within an async method or lambda expression");
- $$ = new Tokenizer.LocatedToken ("await", GetLocation ($1));
- }
+ $$ = Error_AwaitAsIdentifier ($1);
}
;
block_variable_declaration
: variable_type identifier_inside_body
{
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
var li = new LocalVariable (current_block, lt.Value, lt.Location);
current_block.AddLocalName (li);
- current_variable = new BlockVariableDeclaration ((FullNamedExpression) $1, li);
+ current_variable = new BlockVariable ((FullNamedExpression) $1, li);
}
opt_local_variable_initializer opt_variable_declarators SEMICOLON
{
$$ = current_variable;
current_variable = null;
- lbag.AddLocation ($$, GetLocation ($6));
+ if ($4 != null)
+ lbag.AddLocation ($$, PopLocation (), GetLocation ($6));
+ else
+ lbag.AddLocation ($$, GetLocation ($6));
}
| CONST variable_type identifier_inside_body
{
- var lt = (Tokenizer.LocatedToken) $3;
+ var lt = (LocatedToken) $3;
var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.Constant, lt.Location);
current_block.AddLocalName (li);
- current_variable = new BlockConstantDeclaration ((FullNamedExpression) $2, li);
+ current_variable = new BlockConstant ((FullNamedExpression) $2, li);
}
const_variable_initializer opt_const_declarators SEMICOLON
{
| ASSIGN block_variable_initializer
{
current_variable.Initializer = (Expression) $2;
- // TODO: lbag
+ PushLocation (GetLocation ($1));
+ $$ = current_variable;
}
| error
{
variable_declarator
: COMMA identifier_inside_body
{
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
var li = new LocalVariable (current_variable.Variable, lt.Value, lt.Location);
- var d = new BlockVariableDeclaration.Declarator (li, null);
+ var d = new BlockVariableDeclarator (li, null);
current_variable.AddDeclarator (d);
current_block.AddLocalName (li);
lbag.AddLocation (d, GetLocation ($1));
}
| COMMA identifier_inside_body ASSIGN block_variable_initializer
{
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
var li = new LocalVariable (current_variable.Variable, lt.Value, lt.Location);
- var d = new BlockVariableDeclaration.Declarator (li, (Expression) $4);
+ var d = new BlockVariableDeclarator (li, (Expression) $4);
current_variable.AddDeclarator (d);
current_block.AddLocalName (li);
lbag.AddLocation (d, GetLocation ($1), GetLocation ($3));
const_declarator
: COMMA identifier_inside_body ASSIGN constant_initializer_expr
{
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.Constant, lt.Location);
- var d = new BlockVariableDeclaration.Declarator (li, (Expression) $4);
+ var d = new BlockVariableDeclarator (li, (Expression) $4);
current_variable.AddDeclarator (d);
current_block.AddLocalName (li);
lbag.AddLocation (d, GetLocation ($1), GetLocation ($3));
{
ExpressionStatement s = $1 as ExpressionStatement;
if (s == null) {
- Expression.Error_InvalidExpressionStatement (report, GetLocation ($1));
- $$ = new StatementErrorExpression ($1 as Expression);
+ var expr = $1 as Expression;
+ $$ = new StatementErrorExpression (expr);
} else {
$$ = new StatementExpression (s);
}
}
opt_switch_sections CLOSE_BRACE
{
- $$ = new Switch ((Expression) $3, (ExplicitBlock) current_block.Explicit, (List<SwitchSection>) $7, GetLocation ($1));
+ $$ = new Switch ((Expression) $3, (ExplicitBlock) current_block.Explicit, GetLocation ($1));
end_block (GetLocation ($8));
lbag.AddStatement ($$, GetLocation ($2), GetLocation ($4));
}
{
Error_SyntaxError (yyToken);
- $$ = new Switch ((Expression) $3, null, null, GetLocation ($1));
+ $$ = new Switch ((Expression) $3, null, GetLocation ($1));
lbag.AddStatement ($$, GetLocation ($2));
}
;
: /* empty */
{
report.Warning (1522, 1, current_block.StartLocation, "Empty switch block");
- $$ = new List<SwitchSection> ();
}
| switch_sections
;
switch_sections
: switch_section
- {
- var sections = new List<SwitchSection> (4);
-
- sections.Add ((SwitchSection) $1);
- $$ = sections;
- }
| switch_sections switch_section
- {
- var sections = (List<SwitchSection>) $1;
-
- sections.Add ((SwitchSection) $2);
- $$ = sections;
- }
| error
{
Error_SyntaxError (yyToken);
- $$ = new List<SwitchSection> ();
}
;
switch_section
- : switch_labels
- {
- current_block = current_block.CreateSwitchBlock (lexer.Location);
- }
- statement_list
- {
- $$ = new SwitchSection ((List<SwitchLabel>) $1, current_block);
- }
+ : switch_labels statement_list
;
switch_labels
: switch_label
{
- var labels = new List<SwitchLabel> (2);
-
- labels.Add ((SwitchLabel) $1);
- $$ = labels;
+ var label = (SwitchLabel) $1;
+ label.SectionStart = true;
+ current_block.AddStatement (label);
}
| switch_labels switch_label
{
- var labels = (List<SwitchLabel>) ($1);
- labels.Add ((SwitchLabel) $2);
-
- $$ = labels;
+ current_block.AddStatement ((Statement) $2);
}
;
for_initializer
: variable_type identifier_inside_body
{
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
var li = new LocalVariable (current_block, lt.Value, lt.Location);
current_block.AddLocalName (li);
- current_variable = new BlockVariableDeclaration ((FullNamedExpression) $1, li);
+ current_variable = new BlockVariable ((FullNamedExpression) $1, li);
}
opt_local_variable_initializer opt_variable_declarators
{
$$ = current_variable;
+ if ($4 != null)
+ lbag.AddLocation (current_variable, PopLocation ());
+
current_variable = null;
}
| statement_expression_list
start_block (GetLocation ($2));
current_block.IsCompilerGenerated = true;
- var lt = (Tokenizer.LocatedToken) $4;
+ var lt = (LocatedToken) $4;
var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.ForeachVariable | LocalVariable.Flags.Used, lt.Location);
current_block.AddLocalName (li);
start_block (GetLocation ($2));
current_block.IsCompilerGenerated = true;
- var lt = (Tokenizer.LocatedToken) $4;
+ var lt = (LocatedToken) $4;
var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.ForeachVariable | LocalVariable.Flags.Used, lt.Location);
current_block.AddLocalName (li);
$$ = li;
goto_statement
: GOTO identifier_inside_body SEMICOLON
{
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
$$ = new Goto (lt.Value, GetLocation ($1));
lbag.AddStatement ($$, GetLocation ($2), GetLocation ($3));
}
yield_statement
: identifier_inside_body RETURN opt_expression SEMICOLON
{
- var lt = (Tokenizer.LocatedToken) $1;
+ var lt = (LocatedToken) $1;
string s = lt.Value;
if (s != "yield"){
report.Error (1003, lt.Location, "; expected");
{
Error_SyntaxError (yyToken);
- var lt = (Tokenizer.LocatedToken) $1;
+ var lt = (LocatedToken) $1;
string s = lt.Value;
if (s != "yield"){
report.Error (1003, lt.Location, "; expected");
}
| identifier_inside_body BREAK SEMICOLON
{
- var lt = (Tokenizer.LocatedToken) $1;
+ var lt = (LocatedToken) $1;
string s = lt.Value;
if (s != "yield"){
report.Error (1003, lt.Location, "; expected");
FeatureIsNotAvailable (lt.Location, "iterators");
}
- current_block.Explicit.RegisterIteratorYield ();
+ current_block.ParametersBlock.TopBlock.IsIterator = true;
$$ = new YieldBreak (lt.Location);
lbag.AddStatement ($$, GetLocation ($2), GetLocation ($3));
}
c.TypeExpression = (FullNamedExpression) $3;
if ($4 != null) {
- var lt = (Tokenizer.LocatedToken) $4;
+ var lt = (LocatedToken) $4;
c.Variable = new LocalVariable (current_block, lt.Value, lt.Location);
current_block.AddLocalName (c.Variable);
}
$$ = new Catch (null, GetLocation ($1));
}
+ | CATCH open_parens_any type opt_identifier CLOSE_PARENS error
+ {
+ Error_SyntaxError (yyToken);
+
+ // Required otherwise missing block could not be detected because
+ // start_block is run early
+ var c = new Catch (null, GetLocation ($1));
+ c.TypeExpression = (FullNamedExpression) $3;
+
+ if ($4 != null) {
+ var lt = (LocatedToken) $4;
+ c.Variable = new LocalVariable (current_block, lt.Value, lt.Location);
+ }
+
+ lbag.AddLocation (c, GetLocation ($2), GetLocation ($5));
+
+ $$ = c;
+ }
;
checked_statement
start_block (GetLocation ($2));
current_block.IsCompilerGenerated = true;
- var lt = (Tokenizer.LocatedToken) $4;
+ var lt = (LocatedToken) $4;
var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.FixedVariable | LocalVariable.Flags.Used, lt.Location);
current_block.AddLocalName (li);
current_variable = new Fixed.VariableDeclaration ((FullNamedExpression) $3, li);
start_block (GetLocation ($2));
current_block.IsCompilerGenerated = true;
- var lt = (Tokenizer.LocatedToken) $4;
+ var lt = (LocatedToken) $4;
var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.UsingVariable | LocalVariable.Flags.Used, lt.Location);
current_block.AddLocalName (li);
current_variable = new Using.VariableDeclaration ((FullNamedExpression) $3, li);
{
current_block = new Linq.QueryBlock (current_block, lexer.Location);
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
var rv = new Linq.RangeVariable (lt.Value, lt.Location);
$$ = new Linq.QueryExpression (new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$4, rv, GetLocation ($1)));
}
{
current_block = new Linq.QueryBlock (current_block, lexer.Location);
- var lt = (Tokenizer.LocatedToken) $3;
+ var lt = (LocatedToken) $3;
var rv = new Linq.RangeVariable (lt.Value, lt.Location);
$$ = new Linq.QueryExpression (
new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$5, rv, GetLocation ($1)) {
{
current_block = new Linq.QueryBlock (current_block, lexer.Location);
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
var rv = new Linq.RangeVariable (lt.Value, lt.Location);
$$ = new Linq.QueryExpression (new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$4, rv, GetLocation ($1)));
}
{
current_block = new Linq.QueryBlock (current_block, lexer.Location);
- var lt = (Tokenizer.LocatedToken) $3;
+ var lt = (LocatedToken) $3;
var rv = new Linq.RangeVariable (lt.Value, lt.Location);
$$ = new Linq.QueryExpression (
new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$5, rv, GetLocation ($1)) {
}
expression_or_error
{
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
var sn = new Linq.RangeVariable (lt.Value, lt.Location);
$$ = new Linq.SelectMany ((Linq.QueryBlock)current_block, sn, (Expression)$5, GetLocation ($1));
}
expression_or_error
{
- var lt = (Tokenizer.LocatedToken) $3;
+ var lt = (LocatedToken) $3;
var sn = new Linq.RangeVariable (lt.Value, lt.Location);
$$ = new Linq.SelectMany ((Linq.QueryBlock)current_block, sn, (Expression)$6, GetLocation ($1)) {
current_block = new Linq.QueryBlock (current_block, lexer.Location);
}
- BY expression_or_error
+ by_expression
{
- $$ = new Linq.GroupBy ((Linq.QueryBlock)current_block, (Expression)$3, linq_clause_blocks.Pop (), (Expression)$6, GetLocation ($1));
- lbag.AddLocation ($$, GetLocation ($5));
+ var obj = (object[]) $5;
+
+ $$ = new Linq.GroupBy ((Linq.QueryBlock)current_block, (Expression)$3, linq_clause_blocks.Pop (), (Expression)obj[0], GetLocation ($1));
+ lbag.AddLocation ($$, (Location) obj[1]);
current_block.SetEndLocation (lexer.Location);
current_block = current_block.Parent;
}
;
+
+by_expression
+ : BY expression_or_error
+ {
+ $$ = new object[] { $2, GetLocation ($1) };
+ }
+ | error
+ {
+ Error_SyntaxError (yyToken);
+ $$ = new object[2] { null, Location.Null };
+ }
+ ;
query_body_clauses
: query_body_clause
}
expression_or_error
{
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
var sn = new Linq.RangeVariable (lt.Value, lt.Location);
$$ = new Linq.Let ((Linq.QueryBlock) current_block, sn, (Expression)$5, GetLocation ($1));
lbag.AddLocation ($$, GetLocation ($3));
var outer_selector = linq_clause_blocks.Pop ();
var block = linq_clause_blocks.Pop ();
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
var sn = new Linq.RangeVariable (lt.Value, lt.Location);
Linq.RangeVariable into;
((Linq.QueryBlock)current_block).AddRangeVariable (sn);
- lt = (Tokenizer.LocatedToken) $12;
+ lt = (LocatedToken) $12;
into = new Linq.RangeVariable (lt.Value, lt.Location);
$$ = new Linq.GroupJoin (block, sn, (Expression)$5, outer_selector, (Linq.QueryBlock) current_block, into, GetLocation ($1));
var outer_selector = linq_clause_blocks.Pop ();
var block = linq_clause_blocks.Pop ();
- var lt = (Tokenizer.LocatedToken) $3;
+ var lt = (LocatedToken) $3;
var sn = new Linq.RangeVariable (lt.Value, lt.Location);
Linq.RangeVariable into;
((Linq.QueryBlock)current_block).AddRangeVariable (sn);
- lt = (Tokenizer.LocatedToken) $13;
+ lt = (LocatedToken) $13;
into = new Linq.RangeVariable (lt.Value, lt.Location); // TODO:
$$ = new Linq.GroupJoin (block, sn, (Expression)$6, outer_selector, (Linq.QueryBlock) current_block, into, GetLocation ($1)) {
query_body
{
var current_block = linq_clause_blocks.Pop ();
- var lt = (Tokenizer.LocatedToken) $2;
+ var lt = (LocatedToken) $2;
var rv = new Linq.RangeVariable (lt.Value, lt.Location);
$$ = new Linq.QueryStartClause ((Linq.QueryBlock)current_block, null, rv, GetLocation ($1)) {
next = (Linq.AQueryClause)$4
{
module.DocumentationBuilder.ParsedBuiltinType = (TypeExpression)$1;
module.DocumentationBuilder.ParsedParameters = (List<DocumentationParameter>)$4;
- var lt = (Tokenizer.LocatedToken) $3;
+ var lt = (LocatedToken) $3;
$$ = new MemberName (lt.Value);
}
| doc_type_declaration_name DOT THIS
if (expr is Invocation){
report.Error (1002, expr.Location, "Expecting `;'");
} else {
- Expression.Error_InvalidExpressionStatement (report, expr.Location);
+ expr.Error_InvalidExpressionStatement (report);
}
}
report.Error (210, loc, "You must provide an initializer in a fixed or using statement declaration");
}
+object Error_AwaitAsIdentifier (object token)
+{
+ if (async_block) {
+ report.Error (4003, GetLocation (token), "`await' cannot be used as an identifier within an async method or lambda expression");
+ return new LocatedToken ("await", GetLocation (token));
+ }
+
+ return token;
+}
+
void push_current_container (TypeDefinition tc, object partial_token)
{
if (module.Evaluator != null){
mod_locations.Add (Tuple.Create ((Modifiers) token, loc));
}
+[System.Diagnostics.Conditional ("FULL_AST")]
+void PushLocation (Location loc)
+{
+ if (location_stack == null)
+ location_stack = new Stack<Location> ();
+
+ location_stack.Push (loc);
+}
+
+Location PopLocation ()
+{
+ if (location_stack == null)
+ return Location.Null;
+
+ return location_stack.Pop ();
+}
+
string CheckAttributeTarget (string a, Location l)
{
switch (a) {
}
if (e is yyParser.yyException) {
- report.Error (-25, lexer.Location, "Parsing error");
+ if (report.Errors == 0)
+ report.Error (-25, lexer.Location, "Parsing error");
} else {
// Used by compiler-tester to test internal errors
if (yacc_verbose_flag > 0 || e is FatalException)
Location GetLocation (object obj)
{
- var lt = obj as Tokenizer.LocatedToken;
+ var lt = obj as LocatedToken;
if (lt != null)
return lt.Location;
retval = current_anonymous_method;
async_block = (bool) oob_stack.Pop ();
- current_variable = (BlockVariableDeclaration) oob_stack.Pop ();
+ current_variable = (BlockVariable) oob_stack.Pop ();
current_local_parameters = (ParametersCompiled) oob_stack.Pop ();
current_anonymous_method = (AnonymousMethodExpression) oob_stack.Pop ();
// An error message has been reported by tokenizer
if (token == Token.ERROR)
return;
+
+ // Avoid duplicit error message after unterminated string literals
+ if (token == Token.LITERAL && lexer.Location.Column == 0)
+ return;
string symbol = GetSymbolName (token);
string expecting = GetExpecting ();
case Token.LITERAL:
return ((Constant)lexer.Value).GetValue ().ToString ();
case Token.IDENTIFIER:
- return ((Tokenizer.LocatedToken)lexer.Value).Value;
+ return ((LocatedToken)lexer.Value).Value;
case Token.BOOL:
return "bool";