
[英]Compiler Design: How do you distinguish between “op_Minus number” and “negativeNumber”?
[英]How Compiler distinguishes minus and negative number during parser process
嘿,我最近参与了一个编译器开发人员,我遇到了负号(-)和负数(-1)的问题。 假设现在我有5--3、5 + -3,如何编写语法规则,以便在抽象语法树构建期间,yacc会生成正确的抽象语法树? 我的语法像: expr : constant {} | id {} | exec_expr {}
expr : constant {} | id {} | exec_expr {}
expr : constant {} | id {} | exec_expr {}
exec_expr : expr PLUS expr {} | expr MINUS expr {} | expr MUL expr {} | expr DIV expr {}
exec_expr : expr PLUS expr {} | expr MINUS expr {} | expr MUL expr {} | expr DIV expr {}
我现在的想法是处理一个最高位的UMINUS符号(不关联)。 不知何故,我们的编译器不得不将表达式拆分为expr和exec_expr,我已经尝试过该方法,但由于某些原因它无法正常工作。
用其他任何语言处理此案件的标准解决方案是什么? 特别是那些具有LR(0)自动机的机器。 非常感谢!
作为实际工程的问题, 词法分析器通常不处理带符号的数字。
这意味着解析器可以处理负号,可以是两个操作数之间的减法(其中第二个可以是数字),也可以是操作数的负数(其中操作数可以是数字)。 这也使得处理诸如“ a--7”之类的奇数表达式变得容易。 因此,您需要的只是“ MINUS”令牌。
您可以设计一个词法分析器和解析器,让词法分析器吞下符号字符。 通常,它需要解析器的反馈来知道安全的做法。 这很不方便组织,因此不实用。
您只需要添加两个规则:
expr
: constant {}
| id {}
| exec_expr {}
| '+' expr {} // added
| '-' expr {} // added
并定义适当的优先级 我希望以传统方式将其完整写出:
expr
: term
| term '+' term
| term '-' term
;
term
: factor
| factor '*' factor
| factor '/' factor
| factor '%' factor // if you have the % operator
;
factor
: unary
| unary '^' factor // if you have an exponentiation operator. Note right-associativity
;
unary
: primary
| '+' unary
| '-' unary
;
primary
: id
| constant
| '(' expr ')'
;
E&OE
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.