How to match the empty case in CUP parser grammar

你说的曾经没有我的故事 提交于 2019-12-24 06:30:00

问题


I am using CUP to generate a parser, and I want an empty file to be an acceptable program. I have tried add the empty case to my start symbol, based off the response to a similar question here.

start with prog;

/* The grammar rules */
prog    ::= class_block:cb   
        |   class_block:cb stmts:sb
        |   stmts:sb
        |   // desired empty case
        ;

Including the desired empty case gives me the following error:

parser.java:516: error: incompatible types: Object cannot be converted to Symbol
CUP$parser$result = parser.getSymbolFactory().newSymbol("prog",0, ((java_cup.runtime.Symbol)CUP$parser$stack.peek()), RESULT);

How can I modify my grammar so that the parser accepts an empty file? I am using Jflex as my lexer, and ComplexSymbolFactory as the type of the symbols.

EDIT: I've confirmed that the grammar above is the correct way to include empty. However, ComplexSymbolFactory is having problems converting the empty object to a symbol. I get this error even when running this example from the official CUP website.


回答1:


I downloaded the .jars from a friend github project and problem solved.

You can see it's a BUG here: https://github.com/jflex-de/jflex/issues/384

Try to downgrade the version.




回答2:


I don't know about any bugs, but I know you can rewrite your grammar to make the empty case work. for example:

Prog ::= 
   class_block:cb statement:s
   | /* the empty production */
;

I have tried this, and it works for empty productions. Having a production where it is a block and then a statement, or a statement, or an empty, conflicts. there isn't a way to tell during the generation for the parser at the program grammar rules which is a statement and what is an empty. Changing it only being a block and a statement, or an empty clarifies that.



来源:https://stackoverflow.com/questions/52862424/how-to-match-the-empty-case-in-cup-parser-grammar

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!