首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中使用CUP的Parser.cup

在Java中使用CUP的Parser.cup
EN

Stack Overflow用户
提问于 2015-06-29 22:59:52
回答 1查看 1.4K关注 0票数 1

我试着用Java做一个编译器,我用CUP来概括语法。

我有这个Parser.cup

代码语言:javascript
复制
/* Terminals (tokens returned by the scanner). */
terminal PLUS, MINUS;
terminal TIMES, DIV, DIVINT;
terminal LPAREN, RPAREN;
terminal EXP, MOD;
terminal String NUMERIC;
terminal SEMICOLON;
terminal CLOSE_BLOCK;
terminal OPEN_BLOCK;

/* Non terminals */
non terminal expr_list;
non terminal Expression expr;
non terminal Statement statement;
non terminal ListUtil<Statement> stmList;
non terminal ExpressionStatement statementPart;
non terminal BlockStatement block;

/* Precedences */
precedence left OPEN_BLOCK, CLOSE_BLOCK;
precedence left PLUS, MINUS;
precedence left TIMES, DIV, DIVINT, MOD;
precedence left EXP;

start with expr_list;

/* The grammar */

statement ::=
     block:b
    {: RESULT = b; :}
    | statementPart:s
    {: RESULT = s; :}
;

block ::=
    OPEN_BLOCK stmList:s CLOSE_BLOCK
    {: RESULT = new BlockStatement(s); :}
;   

stmList ::= 
    statementPart:s
    {:RESULT = new ListUtil<Statement>(s);:}
    | stmList:stml statementPart:s
    {: RESULT = stml.append(s); :}
| 
    {: RESULT = new ListUtil<Statement>(); :}
;

statementPart ::= expr:e 
    {: 
         RESULT = new ExpressionStatement(e);
    :} 
          SEMICOLON              
;

expr  ::= NUMERIC:n
  {:
    RESULT = new ResultExpression(n);
  :}

| expr:l PLUS expr:r
  {:
    RESULT = new PlusExpression(l, r);
  :}

| expr:l MINUS expr:r
  {:
    RESULT = new MinusExpression(l, r);
  :}

| expr:l TIMES expr:r
  {:
    RESULT = new TimesExpression(l, r);
  :}

| expr:l DIV expr:r
  {:
    RESULT = new DivExpression(l, r);
  :}

| expr:l DIVINT expr:r
  {:
    RESULT = new DivintExpression(l, r);
  :}

| expr:l EXP expr:r
  {:
    RESULT = new ExpExpression(l, r);
  :}

| expr:l MOD expr:r
  {:
    RESULT = new ModExpression(l, r);
  :}

| LPAREN expr:e RPAREN
  {:
    RESULT = e;
  :}
;

当我尝试生成Parser.java时,Eclipse会返回以下警告:

代码语言:javascript
复制
  [cup] Warning : *** Production "expr ::= LPAREN expr RPAREN " never reduced
  [cup] Warning : *** Production "expr ::= expr MOD expr " never reduced
  [cup] Warning : *** Production "expr ::= expr EXP expr " never reduced
  [cup] Warning : *** Production "expr ::= expr DIVINT expr " never reduced
  [cup] Warning : *** Production "expr ::= expr DIV expr " never reduced
  [cup] Warning : *** Production "expr ::= expr TIMES expr " never reduced
  [cup] Warning : *** Production "expr ::= expr MINUS expr " never reduced
  [cup] Warning : *** Production "expr ::= expr PLUS expr " never reduced
  [cup] Warning : *** Production "expr ::= NUMERIC " never reduced
  [cup] Warning : *** Production "statementPart ::= expr NT$0 SEMICOLON " never reduced
  [cup] Warning : *** Production "NT$0 ::= " never reduced
  [cup] Warning : *** Production "stmList ::= " never reduced
  [cup] Warning : *** Production "stmList ::= stmList statementPart " never reduced
  [cup] Warning : *** Production "stmList ::= statementPart " never reduced
  [cup] Warning : *** Production "block ::= OPEN_BLOCK stmList CLOSE_BLOCK " never reduced
  [cup] Warning : *** Production "statement ::= statementPart " never reduced
  [cup] Warning : *** Production "statement ::= block " never reduced

我想删除这个警告,有什么帮助吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-29 23:08:14

你必须用行来改变开头

像这样的东西可以起作用:

从陈述开始;

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31126957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档