5 using Microsoft.Build.Evaluation;
6 using Microsoft.Build.Exceptions;
7 using Microsoft.Build.Framework;
11 Pseudo formal syntax for .NET 4.0 expression:
13 Condition = Expression
21 Expression "==" Expression
22 Expression "!=" Expression
23 Expression ">" Expression
24 Expression ">=" Expression
25 Expression "<" Expression
26 Expression "<=" Expression
27 Expression "And" Expression
28 Expression "Or" Expression
32 "$(" PropertyApplication ")"
34 "@(" ItemApplication ")"
35 MetadataBatchingExpression
36 "%(" MetadataBatchingApplication ")"
37 StringLiteralOrFunction
38 StringLiteralOrFunctionName ( "(" FunctionArguments ")" )?
40 .NET error messages are so detailed which is something like "you forgot '(' after '$' ?" - so
41 it is likely that the MS tokenizer is hand-written.
45 namespace Microsoft.Build.Internal
47 class ExpressionParser
49 const int yacc_verbose_flag = 1;
51 object debug_obj = yacc_verbose_flag == 0 ? null : new yydebug.yyDebugSimple ();
53 public ExpressionList Parse (string source, ExpressionValidationType validationType)
55 var tokenizer = new ExpressionTokenizer (source, validationType);
56 return (ExpressionList) yyparse (tokenizer, debug_obj);
75 %token PROP_OPEN // $(
76 %token ITEM_OPEN // @(
77 %token METADATA_OPEN // %(
78 %token PAREN_OPEN // (
79 %token PAREN_CLOSE // )
91 { $$ = new ExpressionList (); }
92 | ExpressionList Expression
93 { $$ = ((ExpressionList) $1).Add ((Expression) $2); }
96 ExpressionExceptStringLiteralList
98 { $$ = new ExpressionList (); }
99 | ExpressionExceptStringLiteralList ExpressionExceptStringLiteral
100 { $$ = ((ExpressionList) $1).Add ((Expression) $2); }
104 : ExpressionExceptStringLiteral
105 | StringLiteralExpression
108 ExpressionExceptStringLiteral
112 | PropertyAccessExpression
113 | ItemAccessExpression
114 | MetadataAccessExpression
115 | RawStringLiteralOrFunction
116 | ParenthesizedExpression
121 { $$ = new BooleanLiteral () { Value = true, Location = (ILocation) $1 }; }
123 { $$ = new BooleanLiteral () { Value = false, Location = (ILocation) $1 }; }
127 : Expression EQ Expression
128 | Expression NE Expression
129 | Expression GT Expression
130 | Expression GE Expression
131 | Expression LT Expression
132 | Expression LE Expression
133 | Expression AND Expression
134 | Expression OR Expression
139 { $$ = new NotExpression () { Negated = (Expression) $2, Location = (ILocation) $1 }; }
142 PropertyAccessExpression
143 : PROP_OPEN PropertyAccess PAREN_CLOSE
144 { $$ = new PropertyAccessExpression () { Access = (PropertyAccess) $2, Location = (ILocation) $1 }; }
149 { $$ = new PropertyAccess () { Name = (NameToken) $1, Location = (NameToken) $1 }; }
150 | Expression DOT NAME
151 { $$ = new PropertyAccess () { Name = (NameToken) $3, Target = (Expression) $1, Location = (ILocation) $1 }; }
155 : ITEM_OPEN ItemApplication PAREN_CLOSE
156 { $$ = new ItemAccessExpression () { Application = (ItemApplication) $2, Location = (ILocation) $1 }; }
159 // looking a bit messy, but gives different location
162 | NAME ARROW ExpressionList
163 { $$ = new ItemApplication () { Name = (NameToken) $1, Expressions = (ExpressionList) $3, Location = (ILocation) $1 }; }
166 MetadataAccessExpression
167 : METADATA_OPEN MetadataAccess PAREN_CLOSE
168 { $$ = new MetadataAccessExpression () { Access = (MetadataAccess) $2, Location = (ILocation) $1 }; }
171 // looking a bit messy, but gives different location
174 { $$ = new MetadataAccess () { Metadata = (NameToken) $1, Location = (ILocation) $1 }; }
176 { $$ = new MetadataAccess () { Item = (NameToken) $1, Metadata = (NameToken) $3, Location = (ILocation) $1 }; }
179 StringLiteralExpression
180 : APOS ExpressionExceptStringLiteralList APOS
181 { $$ = new StringLiteralExpression () { Contents = (ExpressionList) $2, Location = (ILocation) $1 }; }
182 | QUOT ExpressionExceptStringLiteralList QUOT
183 { $$ = new StringLiteralExpression () { Contents = (ExpressionList) $2, Location = (ILocation) $1 }; }
186 RawStringLiteralOrFunction
188 { $$ = new RawStringLiteral () { Value = (NameToken) $1, Location = (ILocation) $1 }; }
189 | NAME PAREN_OPEN PAREN_CLOSE
190 { $$ = new FunctionCallExpression () { Name = (NameToken) $1, Arguments = new ExpressionList (), Location = (ILocation) $1 }; }
191 | NAME PAREN_OPEN FunctionCallArguments PAREN_CLOSE
192 { $$ = new FunctionCallExpression () { Name = (NameToken) $1, Arguments = (ExpressionList) $3, Location = (ILocation) $1 }; }
195 FunctionCallArguments
197 { $$ = new ExpressionList (); }
198 | FunctionCallArguments COMMA Expression
199 { $$ = ((ExpressionList) $1).Add ((Expression) $3); }
202 ParenthesizedExpression
203 : PAREN_OPEN Expression PAREN_CLOSE
204 { $$ = (Expression) $2; }