java - 是否需要参数

标签 java bnf javacc formal-languages

我在 Java 8 上使用 JavaCC。

我有以下 BNF 表格:

Program -> ( Definition )* EOF
Definition -> ( FUNCTION_DEF ) ( FUNCTION_NAME ) ( PARAMATER_NAME ) ( OPEN_B ) ( FUNCTION_BODY ) ( CLOSE_B ) 

用下面的词法分析器

TOKEN : { < EOL : "\n" | "\r" | "\r\n" > }
TOKEN : { < FUNCTION_DEF : "DEF" > }
TOKEN : { < FUNCTION_NAME : ( ["A"-"Z"] )+ > }
TOKEN : { < PARAMATER_NAME : ( ["a"-"z"] )+ > }
TOKEN : { < OPEN_B : "{" > }
TOKEN : { < CLOSE_B : "}" > }
TOKEN : { < SPACE : " " > }

作为输入,我有以下内容:

DEF ABC x { x+1 }
DEF MAIN { ABC(1) }

我的解析器抛出解析错误,因为它显然需要参数名称。仅当函数名称不是 MAIN 时,我如何才能设法要求参数名称?

谢谢

最佳答案

您可以考虑为 MAIN 函数定义一个单独的表达式,然后将其作为可选部分添加到程序的定义中:

Program -> ( MainDefinition )? ( Definition )* EOF
Definition -> ( FUNCTION_DEF ) ( FUNCTION_NAME ) ( PARAMATER_NAME ) ( OPEN_B ) ( FUNCTION_BODY ) ( CLOSE_B )
MainDefinition -> ( FUNCTION_DEF ) "MAIN" ( OPEN_B ) ( FUNCTION_BODY ) ( CLOSE_B )

编辑

要允许 MAIN 位于其他函数定义的开头、结尾或中间,您只需更改 Program 表达式,如下所示

Program -> ( Definition )* ( MainDefinition )? ( Definition )* EOF

关于java - 是否需要参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43762388/

相关文章:

java - 如果多个正则表达式匹配剩余输入的前缀怎么办?

java - 如何解析 wicket 中的多部分表单数据

java - Fragment : Setting the class variables vs putting the Bundle as arguments in the Fragment 的工厂方法

parsing - 编写 BNF 时 { 和 } 之间有什么?

antlr - 从 antlr 语法生成 BNF 图?

parsing - Unix 命令行选项语法

string - 如何在JavaCC中使用反斜杠转义字符换行?

java - 良好的 Java 属性文件编辑器

java - 如何在自定义对象类中设置 @ServerTimestamp 注释 - Firestore

JavaCC 换行符可能会导致解析问题