【发布时间】:2018-04-25 03:19:29
【问题描述】:
我正在尝试为一种简单的语言生成词法分析器和解析器。目前,该语言只能解析条件表达式。条件表达式很像 C 语言中的表达式,而且因为我只是在这里学习基本知识,所以我们在 C 语言这样的语言中遇到的所有问题我都不会关心如何实现。
我的语法如下:
grammar Simple ;
cond_expr : left_paren operand operator operand right_paren ;
operand : function_expr | ID | literal | cond_expr ;
function_expr : ID left_paren paramList right_paren ;
paramList : param (',' param)* ;
param : ID | function_expr ;
literal : string | number ;
string : '"' sentence '"' ;
sentence : (WORD | WORD (' ' WORD)*)* ;
number : INTEGER | FLOAT ;
left_paren : LEFT_PAREN ;
right_paren : RIGHT_PAREN ;
operator : OPERATOR ;
INTEGER : [0-9]+ ;
FLOAT : INTEGER '.' INTEGER | '.' INTEGER ;
LEFT_PAREN : '(' ;
RIGHT_PAREN : ')' ;
ID : [A-Za-z]+[A-Za-z0-9_]* ;
WORD : [A-Za-z]+ ;
OPERATOR : ('==' | '>=' | '<=' | '!=' | '&&' | '||' | '~') ;
WS : (' '|'\r'|'\n'|'\t') -> channel(HIDDEN);
当我在它上面运行解析器时,我没有得到我期望的结果。以下是错误输出的示例:
~/sandbox $ grun Simple cond_expr -tree
(a (c, d (e, f)) != b)
line 1:2 mismatched input ' ' expecting OPERATOR
line 1:5 mismatched input ',' expecting OPERATOR
line 1:8 mismatched input ' ' expecting ')'
(cond_expr (left_paren () (operand a) (operator ) (operand (cond_expr (left_paren () (operand c) (operator , ) (operand d) (right_paren ( e , f))) (right_paren )))
我的语法有什么错误?任何帮助表示赞赏。
【问题讨论】:
-
WS规则不完整。 -
请不要在您的代码中使用 JS sn-p 包装器,因为您实际上这里没有 JS 代码。
-
@GRosenberg:对不起,WS 规则不完整,因为错字,我现在已经更正了。
-
@MikeLischke:抱歉,感谢您的指正!
-
对我来说,您的测试输入似乎不符合您的语法 -
a后面应该跟一个运算符。