我正在使用CUP和JFlex来验证表达式语法.我有基本的功能:我可以判断一个表达式是否有效.
下一步是实现简单的算术运算,例如"add 1".例如,如果我的表达式是"1 + a",则结果应为"2 + a".我需要访问解析树来执行此操作,因为简单地识别数字术语将不会这样做:将"1(a +)*b + 1"添加1的结果应为"(1 + a)*b + 1" ,而不是"(2 + a)*b".
有没有人有一个生成解析树的CUP示例?我想我可以从那里拿走它.
作为额外的奖励,有没有办法使用JFlex获取表达式中所有令牌的列表?看起来像一个典型的用例,但我无法弄清楚如何做到这一点.
编辑:找到有关堆栈溢出的有希望的线索: 从解析器创建抽象树问题
讨论CUP和AST:
http://pages.cs.wisc.edu/~fischer/cs536.s08/lectures/Lecture16.4up.pdf
具体来说,这一段:
解析器返回的符号与语法的起始符号相关联,并包含整个源程序的AST
这没有用.如果Symbol类没有任何导航指针给它的子节点,如何遍历给定Symbol实例的树?换句话说,它看起来或行为不像树节点:
package java_cup.runtime;
/**
* Defines the Symbol class, which is used to represent all terminals
* and nonterminals while parsing. The lexer should pass CUP Symbols
* and CUP returns a Symbol.
*
* @version last updated: 7/3/96
* @author Frank Flannery
*/
/* ****************************************************************
Class Symbol
what the parser expects …Run Code Online (Sandbox Code Playgroud) 我收到以下错误:
Warning : *** Shift/Reduce conflict found in state #116
between Statement ::= Matched (*)
and Unmatched ::= IF LPAREN Condition RPAREN Matched (*) ELSE Unmatched
and Matched ::= IF LPAREN Condition RPAREN Matched (*) ELSE Matched
under symbol ELSE
Resolved in favor of shifting.
Run Code Online (Sandbox Code Playgroud)
现在,我知道悬挂的其他问题,我尝试使语法明确:
Statement ::= Matched | Unmatched ;
Matched ::= IF LPAREN Condition RPAREN Matched ELSE Matched
|
Others
;
Unmatched ::= IF LPAREN Condition RPAREN Statement
|
IF LPAREN Condition RPAREN Matched ELSE Unmatched
; …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 JFlex 和 Cup 为 javascript 风格的语言编写一个解析器,但是我遇到了一些致命的移位/归约问题和归约/归约问题。
我已经彻底搜索并找到了大量示例,但我无法将它们推断为我的语法。到目前为止我的理解是,这些问题是因为解析器无法决定应该采取哪种方式,因为它无法区分。
我的语法如下:从 INPUT 开始;
INPUT::= PROGRAM;
PROGRAM::= FUNCTION NEWLINE PROGRAM
| NEWLINE PROGRAM;
FUNCTION ::= function OPTIONAL id p_izq ARG p_der NEWLINE l_izq NEWLINE BODY l_der;
OPTIONAL ::=
| TYPE;
TYPE::= integer
| boolean
ARG ::=
| TYPE id MORE_ARGS;
MORE_ARGS ::=
| colon TYPE id MORE_ARGS;
NEWLINE ::= salto NEWLINE
| ;
BODY ::= ;
Run Code Online (Sandbox Code Playgroud)
我遇到了一些冲突,但这两个只是一个例子:
Warning : *** Shift/Reduce conflict found in state #5
between NEWLINE ::= (*)
and NEWLINE ::= …Run Code Online (Sandbox Code Playgroud) compiler-construction grammar parsing shift-reduce-conflict cup