标签: cup

使用Java CUP解析树生成

我正在使用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)

grammar parsing lexer jflex cup

4
推荐指数
1
解决办法
1万
查看次数

转移/减少java杯中的冲突 - 悬空其他问题

我收到以下错误:

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)

java compiler-construction parsing cup

4
推荐指数
1
解决办法
1188
查看次数

转移/减少 CUP 中的冲突

我正在尝试使用 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

1
推荐指数
1
解决办法
2362
查看次数