问题描述
我找不到最能帮助解决问题的问题/答案。因此,我在这里发布此问题。
例如
在这里我有点分隔的单词。我正在使用antlr3,下面是我的语法。
parse
: expr
;
list_expr : <I removed the grammar here>
SimpleType : ('a'..'z'|'A'..'Z'|'_')('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
QualifiedType : SimpleType | SimpleType ('\.' SimpleType)+;
expr : list_expr
| QualifiedType
| union_expr;
/*------------------------------------------------------------------
* LEXER RULES
*------------------------------------------------------------------*/
WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ { $channel = HIDDEN; } ;
在这里,SympleType
表示单词的语法。我的要求是为QualifiedType
建立语法。上面给出的当前语法无法正常工作(QualifiedType : SimpleType | SimpleType ('\.'SimpleType)+;
)。 如何为合格名称(点分隔的单词)编写正确的语法?
解决方法
使class Solution:
def reverse(self,x: int):
reverse = 0
if x > 0:
while x != 0:
remainder = x % 10
if reverse > (2147483647/10):
return 0
reverse = reverse * 10 + remainder
x = int(x / 10)
return reverse
elif x < 0:
x = x * (-1)
while x != 0:
remainder = x % 10
if reverse > ((2147483648)/10):
return 0
reverse = reverse * 10 + remainder
x = int(x / 10)
reverse = reverse * (-1)
return reverse
else:
return 0
成为解析器规则而不是词法分析器规则:
QualifiedType
此外,qualifiedType : SimpleType ('.' SimpleType)*;
不需要转义:'\.'
可以。
编辑
您必须设置the output to AST
and apply some tree rewrite rules才能使其正常工作。这是一个快速演示:
'.'
如果现在运行代码:
grammar T;
options {
output=AST;
}
tokens {
Root;
QualifiedName;
}
parse
: qualifiedType EOF -> ^(Root qualifiedType)
;
qualifiedType
: SimpleType ('.' SimpleType)* -> ^(QualifiedName SimpleType+)
;
SimpleType
: ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '0'..'9' | '_')*
;
您将获得一些DOT output,它对应于以下AST: