JavaCC语法问题,具有理解能力

标签 java parsing javacc compiler-compiler

我开始学习 Javacc 并试图解决这个问题,但我似乎无法完全理解我这样做是否正确。

所以我正在做的是为自定义语言制作一个解析器并使用 Javacc 生成 Java 解析器源代码。

我认为我这样做是正确的,但对这是否正确有很多疑问。

这是我迄今为止拥有的 .jj 文件。

options {
  JAVA_UNICODE_ESCAPE = true;
  STATIC = false;
}

PARSER_BEGIN(Custom_Lexer)
  public class Custom_Lexer {}
PARSER_END(Custom_Lexer)


void Custom_Lexer_Program() :
{}
{
  <BEGIN> <CLPL>
  ( Custom_Lexer_Statement() )*
  <END>
  <EOF>
}

void Custom_Lexer_Statement():
{}
{
    STATEMENT()
    <SEMICOLON>
}

void STATEMENT():
{}
{
    LOOKAHEAD(2) OUTPUT_STATEMENT()     |
    LOOKAHEAD(2) INPUT_STATEMENT()      |
    LOOKAHEAD(2) VARIABLE_DECLARATION() | 
    LOOKAHEAD(2) VARIABLE_ASSIGNMENT()  |
    LOOKAHEAD(2) IF_THEN_STATEMENT()
}

void OUTPUT_STATEMENT():
{}
{
    <OUTPUT> <EQUALS> EXPRESSION()
}

void INPUT_STATEMENT():
{}
{
    VARIABLE_DECLARATION()*
}

void VARIABLE_DECLARATION():
{}
{
    <VARIABLE> (<EQUALS> <INT> | <BOOL> | <STRING>)?
}

void VARIABLE_ASSIGNMENT():
{}
{
    <VARIABLE> (<EQUALS> EXPRESSION()
}

void IF_THEN_STATEMENT():
{}
{
    <IF> EXPRESSION() <THEN> VARIABLE_ASSIGNMENT() [<ELSE> VARIABLE_ASSIGNMENT()]
}
//Will define these later after the above issues are fixed
void EXPRESSION():
{}
{
    LOOKAHEAD(5) BINARY_EXPRESSION()        |
    LOOKAHEAD(5) IDENTIFIER_EXPRESSION()    |
    LOOKAHEAD(5) LITERAL_VALUE_EXPRESSION() |
    LOOKAHEAD(5) PARENTHESIZED_EXPRESSION()
}


//Reserved words
TOKEN: { <CLPL:   "CLPL"   > }
TOKEN: { <BEGIN:   "BEGIN"   > }
TOKEN: { <END:     "END"     > }
TOKEN: { <OUTPUT:  "OUTPUT"  > }
TOKEN: { <INPUT:   "INPUT"   > }
TOKEN: { <IF:      "IF"      > }
TOKEN: { <THEN:    "THEN"    > }


TOKEN: { <INT:    "int"      > }
TOKEN: { <BOOL:   "bool"     > }
TOKEN: { <STRING: "string"   > }


TOKEN: { <SEMICOLON:     ";" > }
TOKEN: { <LEFT_PAREN:    "(" > }
TOKEN: { <RIGHT_PAREN:   ")" > }
TOKEN: { <PLUS:          "+" > }
TOKEN: { <MINUS:         "-" > }
TOKEN: { <MULTIPLY:      "*" > }
TOKEN: { <DIVIDE:        "/" > }
TOKEN: { <EQUALITY:     "==" > }
TOKEN: { <EQUALS:        "=" > }
TOKEN: { <GT:            ">" > }
TOKEN: { <LT:            "<" > }


TOKEN: { <BOOLEAN_LITERAL: "true" | "false" > }


TOKEN: { <INTEGER_LITERAL: (["0"-"9"])+ > }


TOKEN: { <STRING_LITERAL: "\"" (~["\"","\\","\n","\r"] | "\\" (["n","t","b","r","f","\\","\'","\""] | ["0"-"7"] (["0"-"7"])? | ["0"-"3"] ["0"-"7"] ["0"-"7"]))* "\""> }


TOKEN: { <IDENTIFIER: (["a"-"z"]|["A"-"Z"]|"_")+((["a"-"z","A"-"Z","0"-"9","_"])*)? > } 

最佳答案

它尚未完成,但看起来是一个合理的开始。我建议您避免所有 LOOKAHEAD 规范,直到您更好地了解自己在做什么。尝试左分解,以便可以使用默认的前瞻方法进行所有选择。

我发现的一个问题是 VARIABLE_DECLARATIONINPUT_STATMENT 之间的冲突无法解决,因为任何 VARIABLE_DECLARATION 也是一个 INPUT_STATMENT

关于JavaCC语法问题,具有理解能力,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58617702/

相关文章:

java - JavaCC 生成的代码中出现 NoClassDefFoundError

java - 如何模块化 JavaCC 语法文件 (.jj)?

java - 无法使用代码录制屏幕

java - Spring Web MVC : Simple controller - $-expression doesn't work

parsing - 为解析器标记数字

php - 解析带有格式化文本的 HTML

java - 修改hibernate中的映射表名称

java - 如何将 java 编辑器中的文本作为参数传递给我的 netbeans 模块?

java - 如何为用户输入(单词)分配一个要在代码中使用的整数值

java - javaCC 中的无语法部分