【发布时间】:2014-03-05 17:35:19
【问题描述】:
以下 Antlr3 语法文件不支持作为 STRING 词法分析器规则的一部分的转义双引号。任何想法为什么?
表达式工作:
- \"你好\"
- ref(\"你好\",\"你好\")
表达式不起作用:
- \"h\"e\"l\"l\"o\"
- ref(\"hello\", \"hel\"lo\")
可在 AntlrWorks 中运行的 Antlr3 语法文件:
grammar Grammar;
options
{
output=AST;
ASTLabelType=CommonTree;
language=CSharp3;
}
public oaExpression
: exponentiationExpression EOF!
;
exponentiationExpression
: equalityExpression ( '^' equalityExpression )*
;
equalityExpression
: relationalExpression ( ( ('==' | '=' ) | ('!=' | '<>' ) ) relationalExpression )*
;
relationalExpression
: additiveExpression ( ( '>' | '>=' | '<' | '<=' ) additiveExpression )*
;
additiveExpression
: multiplicativeExpression ( ( '+' | '-' ) multiplicativeExpression )*
;
multiplicativeExpression
: primaryExpression ( ( '*' | '/' ) primaryExpression )*
;
primaryExpression
: '(' exponentiationExpression ')' | value | identifier (arguments )?
;
value
: STRING
;
identifier
: ID
;
expressionList
: exponentiationExpression ( ',' exponentiationExpression )*
;
arguments
: '(' ( expressionList )? ')'
;
/*
* Lexer rules
*/
ID
: LETTER (LETTER | DIGIT)*
;
STRING
: '"' ( options { greedy=false; } : ~'"' )* '"'
;
WS
: (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=Hidden;}
;
/*
* Fragment Lexer rules
*/
fragment
LETTER
: 'a'..'z'
| 'A'..'Z'
| '_'
;
fragment
EXPONENT
: ('e'|'E') ('+'|'-')? ( DIGIT )+
;
fragment
HEX_DIGIT
: ( DIGIT |'a'..'f'|'A'..'F')
;
fragment
DIGIT
: '0'..'9'
;
【问题讨论】:
-
为什么?我的意思是该规则仅在没有结束引号时匹配整个输入,在这种情况下输入无论如何都是无效的,对吗?你能澄清一下吗?
-
嗨@BartKiers,我已经编辑了问题以提供完整的语法。我已经尝试了您的建议,但它们似乎不起作用。
标签: parsing antlr antlr3 lexer