Browse Source

Fixed bug: ParseExpression could not parse "a >>= b"

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@418 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 20 years ago
parent
commit
08c23a51d9
  1. 1042
      src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs
  2. 38
      src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG
  3. 4
      src/Libraries/NRefactory/Test/Parser/Expressions/AssignmentExpressionTests.cs

1042
src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs

File diff suppressed because it is too large Load Diff

38
src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG

@ -1675,7 +1675,8 @@ AssignmentOperator<out AssignmentOperatorType op>
| "|=" (. op = AssignmentOperatorType.BitwiseOr; .) | "|=" (. op = AssignmentOperatorType.BitwiseOr; .)
| "^=" (. op = AssignmentOperatorType.ExclusiveOr; .) | "^=" (. op = AssignmentOperatorType.ExclusiveOr; .)
| "<<=" (. op = AssignmentOperatorType.ShiftLeft; .) | "<<=" (. op = AssignmentOperatorType.ShiftLeft; .)
| ">" ">=" (. op = AssignmentOperatorType.ShiftRight; .) | IF (la.kind == Tokens.GreaterThan && Peek(1).kind == Tokens.GreaterEqual)
">" ">=" (. op = AssignmentOperatorType.ShiftRight; .)
. .
ArrayInitializer<out Expression outExpr> ArrayInitializer<out Expression outExpr>
@ -1941,35 +1942,28 @@ ResourceAcquisition<out Statement stmt>
. .
StatementExpr<out Statement stmt> StatementExpr<out Statement stmt>
(. Expression expr; .)
= =
/* We don't know why, but it's in the grammar. */ Expr<out expr>
/* (see internal document: assignment.txt) */ /* The grammar allows only assignments or method invocations here, */
(. /* but we don't enforce that here */
bool mustBeAssignment = la.kind == Tokens.Plus || la.kind == Tokens.Minus || (. stmt = new StatementExpression(expr); .)
la.kind == Tokens.Not || la.kind == Tokens.BitwiseComplement ||
la.kind == Tokens.Times || la.kind == Tokens.BitwiseAnd || IsTypeCast();
Expression expr = null;
.)
UnaryExpr<out expr>
/*--- assignment */
(
(. AssignmentOperatorType op; Expression val; .) AssignmentOperator<out op> Expr<out val> (. expr = new AssignmentExpression(expr, op, val); .)
| (. if (mustBeAssignment) Error("error in assignment."); .)
) (. stmt = new StatementExpression(expr); .)
. .
Expr<out Expression expr> Expr<out Expression expr>
(. expr = null; Expression expr1 = null, expr2 = null; .) (. expr = null; Expression expr1 = null, expr2 = null; AssignmentOperatorType op; .)
= =
UnaryExpr<out expr> UnaryExpr<out expr>
/*--- conditional expression: */ /*--- conditional expression: */
( (
ConditionalOrExpr<ref expr> ( AssignmentOperator<out op> Expr<out expr1> (. expr = new AssignmentExpression(expr, op, expr1); .) )
[ "??" Expr<out expr1> (. expr = new BinaryOperatorExpression(expr, BinaryOperatorType.NullCoalescing, expr1); .) ] | IF (la.kind == Tokens.GreaterThan && Peek(1).kind == Tokens.GreaterEqual)
[ "?" Expr<out expr1> ":" Expr<out expr2> (. expr = new ConditionalExpression(expr, expr1, expr2); .) ] ( AssignmentOperator<out op> Expr<out expr1> (. expr = new AssignmentExpression(expr, op, expr1); .) )
/*--- assignment: */ | (
| (. AssignmentOperatorType op; Expression val; .) AssignmentOperator<out op> Expr<out val> (. expr = new AssignmentExpression(expr, op, val); .) ConditionalOrExpr<ref expr>
[ "??" Expr<out expr1> (. expr = new BinaryOperatorExpression(expr, BinaryOperatorType.NullCoalescing, expr1); .) ]
[ "?" Expr<out expr1> ":" Expr<out expr2> (. expr = new ConditionalExpression(expr, expr1, expr2); .) ]
)
) )
. .

4
src/Libraries/NRefactory/Test/Parser/Expressions/AssignmentExpressionTests.cs

@ -19,14 +19,12 @@ namespace ICSharpCode.NRefactory.Tests.AST
#region C# #region C#
void CSharpTestAssignmentExpression(string program, AssignmentOperatorType op) void CSharpTestAssignmentExpression(string program, AssignmentOperatorType op)
{ {
StatementExpression se = (StatementExpression)ParseUtilCSharp.ParseStatment(program + ";", typeof(StatementExpression)); AssignmentExpression ae = (AssignmentExpression)ParseUtilCSharp.ParseExpression(program, typeof(AssignmentExpression));
AssignmentExpression ae = se.Expression as AssignmentExpression;
Assert.AreEqual(op, ae.Op); Assert.AreEqual(op, ae.Op);
Assert.IsTrue(ae.Left is IdentifierExpression); Assert.IsTrue(ae.Left is IdentifierExpression);
Assert.IsTrue(ae.Right is IdentifierExpression); Assert.IsTrue(ae.Right is IdentifierExpression);
} }
[Test] [Test]

Loading…
Cancel
Save