/// </summary>
Block current_block;
- BlockVariableDeclaration current_variable;
+ BlockVariable current_variable;
Delegate current_delegate;
// Keeps track of global data changes to undo on parser error
//
public Undo undo;
+
+ bool? interactive_async;
Stack<Linq.QueryBlock> linq_clause_blocks;
//
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");
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);
+ lbag.AddLocation ($$, GetLocation ($2));
}
| error
{
var sect = (List<Attribute>) $2;
if (attrs == null)
attrs = new Attributes (sect);
- else
+ else if (sect != null)
attrs.AddAttributes (sect);
$$ = attrs;
}
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 (yyToken, GetTokenName (yyToken), GetLocation ($1));
+ $$ = null;
}
;
attribute_target
: IDENTIFIER
{
- var lt = (Tokenizer.LocatedToken) $1;
- $$ = CheckAttributeTarget (lt.Value, lt.Location);
+ var lt = (LocatedToken) $1;
+ $$ = CheckAttributeTarget (yyToken, 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_semicolon
{
- lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($14), GetLocation ($16));
+ if ($16 == null) {
+ lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($14));
+ } else {
+ lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($14), GetLocation ($16));
+ }
$$ = pop_current_class ();
}
| opt_attributes opt_modifiers opt_partial STRUCT error
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);
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);
{
--lexer.parsing_block;
current_field.Initializer = (Expression) $3;
+ lbag.AppendToMember (current_field, GetLocation ($1));
end_block (lexer.Location);
current_local_parameters = null;
}
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));
}
current_type.AddMember (method);
- if ($11 != null)
- method.SetConstraints ((List<Constraints>) $11);
+ async_block = (method.ModFlags & Modifiers.ASYNC) != 0;
+
+ if ($12 != null)
+ method.SetConstraints ((List<Constraints>) $12);
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
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));
}
}
opt_semicolon
{
- lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($13));
+ if ($15 == null) {
+ lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($13));
+ } else {
+ lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($13), GetLocation ($15));
+ }
$$ = pop_current_class ();
}
| opt_attributes opt_modifiers opt_partial INTERFACE error
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");
}
}
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){
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
}
opt_enum_member_declarations
{
+ lexer.parsing_modifiers = true;
+
// here will be evaluated after CLOSE_BLACE is consumed.
if (doc_support)
Lexer.doc_state = XmlCommentState.Allowed;
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;
- $$ = new TypeParameter (new MemberName (lt.Value, lt.Location), (Attributes)$1, (Variance) $2);
+ var lt = (LocatedToken)$3;
+ $$ = new TypeParameter (new MemberName (lt.Value, lt.Location), (Attributes)$1, (VarianceDecl) $2);
}
| error
{
else
Error_SyntaxError (yyToken);
- $$ = new TypeParameter (MemberName.Null, null, Variance.None);
+ $$ = new TypeParameter (MemberName.Null, null, null);
}
;
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, null);
lbag.AddLocation ($$, GetLocation ($2));
- }
+ }
;
opt_object_or_collection_initializer
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));
}
| OPEN_BRACE expression_list CLOSE_BRACE
{
if ($2 == null)
- $$ = null;
+ $$ = new CollectionElementInitializer (GetLocation ($1));
else
$$ = new CollectionElementInitializer ((List<Expression>)$2, GetLocation ($1));
+
+ lbag.AddLocation ($$, GetLocation ($2));
}
| OPEN_BRACE CLOSE_BRACE
{
report.Error (1920, GetLocation ($1), "An element initializer cannot be empty");
- $$ = null;
- }
+ $$ = new CollectionElementInitializer (GetLocation ($1));
+ lbag.AddLocation ($$, GetLocation ($2));
+ }
;
initializer_value
;
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");
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);
}
;
if (current_anonymous_method is LambdaExpression) {
report.Error (4034, GetLocation ($1),
"The `await' operator can only be used when its containing lambda expression is marked with the `async' modifier");
- } else if (current_anonymous_method is AnonymousMethodExpression) {
+ } else if (current_anonymous_method != null) {
report.Error (4035, GetLocation ($1),
"The `await' operator can only be used when its containing anonymous method is marked with the `async' modifier");
+ } else if (interactive_async != null) {
+ current_block.Explicit.RegisterAsyncAwait ();
+ interactive_async = true;
} else {
report.Error (4033, GetLocation ($1),
"The `await' operator can only be used when its containing method is marked with the `async' modifier");
$$ = 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 ('}');
+ }
;
assignment_expression
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
: 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");
}
opt_semicolon
{
- lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($13), GetLocation ($15));
+ if ($15 == null) {
+ lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($13));
+ } else {
+ lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($13), GetLocation ($15));
+ }
$$ = pop_current_class ();
}
;
: /* 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));
}
;
opt_type_parameter_variance
: /* empty */
{
- $$ = Variance.None;
+ $$ = null;
}
| type_parameter_variance
{
type_parameter_variance
: OUT
{
- $$ = Variance.Covariant;
+ $$ = new VarianceDecl (Variance.Covariant, GetLocation ($1));
}
| IN
{
- $$ = Variance.Contravariant;
+ $$ = new VarianceDecl (Variance.Contravariant, 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) {
var expr = $1 as Expression;
- expr.Error_InvalidExpressionStatement (report);
$$ = new StatementErrorExpression (expr);
} else {
$$ = new StatementExpression (s);
: expression
{
Expression expr = (Expression) $1;
- ExpressionStatement s;
-
- s = new OptionalAssign (new SimpleName ("$retval", lexer.Location), expr, lexer.Location);
- $$ = new StatementExpression (s);
+ $$ = new StatementExpression (new OptionalAssign (expr, lexer.Location));
}
| error
{
}
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));
}
$$ = new Throw ((Expression) $2, GetLocation ($1));
lbag.AddStatement ($$, GetLocation ($3));
}
+ | THROW expression error
+ {
+ Error_SyntaxError (yyToken);
+ $$ = new Throw ((Expression) $2, GetLocation ($1));
+ }
| THROW error
{
Error_SyntaxError (yyToken);
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));
}
}
| TRY block FINALLY block
{
- $$ = new TryFinally ((Statement) $2, (Block) $4, GetLocation ($1));
+ $$ = new TryFinally ((Statement) $2, (ExplicitBlock) $4, GetLocation ($1));
lbag.AddStatement ($$, GetLocation ($3));
}
| TRY block catch_clauses FINALLY block
{
- $$ = new TryFinally (new TryCatch ((Block) $2, (List<Catch>) $3, Location.Null, true), (Block) $5, GetLocation ($1));
+ $$ = new TryFinally (new TryCatch ((Block) $2, (List<Catch>) $3, Location.Null, true), (ExplicitBlock) $5, GetLocation ($1));
lbag.AddStatement ($$, GetLocation ($4));
}
| TRY block error
catch_clause
: CATCH block
{
- $$ = new Catch ((Block) $2, GetLocation ($1));
+ $$ = new Catch ((ExplicitBlock) $2, GetLocation ($1));
}
| CATCH open_parens_any type opt_identifier CLOSE_PARENS
{
start_block (GetLocation ($2));
- var c = new Catch (current_block, GetLocation ($1));
+ var c = new Catch ((ExplicitBlock) current_block, GetLocation ($1));
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);
}
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);
}
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);
Fixed f = new Fixed ((Fixed.VariableDeclaration) $9, (Statement) $10, GetLocation ($1));
current_block.AddStatement (f);
+ lbag.AddStatement (f, GetLocation ($2), GetLocation ($8));
$$ = end_block (GetLocation ($8));
}
;
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)));
+ var clause = new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$4, rv, GetLocation ($1));
+ lbag.AddLocation (clause, GetLocation ($3));
+ $$ = new Linq.QueryExpression (clause);
}
| FROM_FIRST type identifier_inside_body IN expression
{
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)) {
+ var clause = new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$5, rv, GetLocation ($1)) {
IdentifierType = (FullNamedExpression)$2
- }
- );
+ };
+ lbag.AddLocation (clause, GetLocation ($4));
+ $$ = new Linq.QueryExpression (clause);
}
;
{
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)));
+ var clause = new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$4, rv, GetLocation ($1));
+ lbag.AddLocation (clause, GetLocation ($3));
+ $$ = new Linq.QueryExpression (clause);
}
| FROM type identifier_inside_body IN expression
{
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)) {
+ var clause = new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$5, rv, GetLocation ($1)) {
IdentifierType = (FullNamedExpression)$2
- }
- );
+ };
+ lbag.AddLocation (clause, GetLocation ($4));
+ $$ = new Linq.QueryExpression (clause);
}
;
}
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));
current_block = current_block.Parent;
((Linq.QueryBlock)current_block).AddRangeVariable (sn);
+ lbag.AddLocation ($$, GetLocation ($3));
}
| FROM type identifier_inside_body IN
{
}
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 = current_block.Parent;
((Linq.QueryBlock)current_block).AddRangeVariable (sn);
+
+ lbag.AddLocation ($$, GetLocation ($4));
}
;
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;
$$ = new Linq.Join (block, sn, (Expression)$6, outer_selector, (Linq.QueryBlock) current_block, GetLocation ($1)) {
IdentifierType = (FullNamedExpression)$2
};
+ lbag.AddLocation ($$, GetLocation ($3), GetLocation ($6), GetLocation ($9));
} else {
//
// Set equals right side parent to beginning of linq query, it is not accessible therefore cannot cause name collisions
((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
mods |= Modifiers.UNSAFE;
current_local_parameters = pars;
- Method method = new Method (
+ var method = new InteractiveMethod (
current_type,
new TypeExpression (compiler.BuiltinTypes.Void, Location.Null),
mods,
- new MemberName ("Host"),
- pars,
- null /* attributes */);
+ pars);
current_type.AddMember (method);
-
oob_stack.Push (method);
+
+ interactive_async = false;
+
++lexer.parsing_block;
start_block (lexer.Location);
}
interactive_statement_list opt_COMPLETE_COMPLETION
{
--lexer.parsing_block;
- Method method = (Method) oob_stack.Pop ();
-
+ var method = (InteractiveMethod) oob_stack.Pop ();
method.Block = (ToplevelBlock) end_block(lexer.Location);
+ if (interactive_async == true) {
+ method.ChangeToAsync ();
+ }
+
InteractiveResult = (Class) pop_current_class ();
current_local_parameters = null;
}
{
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
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));
}
-string CheckAttributeTarget (string a, Location l)
+[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 (int token, string a, Location l)
{
switch (a) {
case "assembly" : case "module" : case "field" : case "method" : case "param" : case "property" : case "type" :
return a;
}
- report.Warning (658, 1, l,
- "`{0}' is invalid attribute target. All attributes in this attribute section will be ignored", a);
+ if (!Tokenizer.IsValidIdentifier (a)) {
+ Error_SyntaxError (token);
+ } else {
+ report.Warning (658, 1, l,
+ "`{0}' is invalid attribute target. All attributes in this attribute section will be ignored", a);
+ }
+
return string.Empty;
}
lang_version = settings.Version;
yacc_verbose_flag = settings.VerboseParserFlag;
doc_support = settings.DocumentationFile != null;
- lexer = new Tokenizer (reader, file, session);
+ lexer = new Tokenizer (reader, file, session, report);
oob_stack = new Stack<object> ();
lbag = session.LocationsBag;
use_global_stacks = session.UseJayGlobalArrays;
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 ();
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";