Java Cc令牌和解析器

时间:2016-03-13 02:56:06

标签: java compiler-construction javacc

我正在用java cc编写一个程序,我正在编写一个编译器。我已经在.jj文件中编写了一个代码,我已经定义了令牌和解析器,但是在文件的末尾,程序发出错误,不知道为什么。请帮我解决这个问题。

void Start () : {}
{
  (
      INTEGER_CONSTANT
    | STRING_CONSTANT
    | LOGIC_CONSTANT
    | NOT
    | IF
    | END
    | SUB
    | LET
    | CALL
    | THEN
    | CASE
    | ELSE
    | INPUT
    | PRINT
    | SELECT
    | STATIC
    | IDENTIFIER
  )*
  <EOF>
}

我有以下错误:

  

org.javacc.parser.ParseException:遇到“   “INTEGER_CONSTANT”“|” “|”“STRING_CONSTANT”“|” “|   “”LOGIC_CONSTANT“”|“”| “”不是“”|“   “|”“IF”“|” “|”“结束”“|” “|”    “SUB”“|” “|”“LET”“|” “|”    “打电话”“|” “|”“那么”“|” “|”    “CASE”“|” “|”“ELSE”“|” “|”    “输入”“|” “|”“打印”“|” “|”    “SELECT”“|” “|”“STATIC”“|” “|”    “IDENTIFIER”“)”“)”“”“”“在第91行第7行。

2 个答案:

答案 0 :(得分:1)

假设您具有解析器方法中使用的所有标记(在词法规范部分中)的有效声明,则需要在尖括号内使用这些标记。见下文

void Start () : {}
{
  (
      <INTEGER_CONSTANT>
    | <STRING_CONSTANT>
    | <LOGIC_CONSTANT>
    | <NOT>
    | <IF>
    | <END>
    | <SUB>
    | <LET>
    | <CALL>
    | <THEN>
    | <CASE>
    | <ELSE>
    | <INPUT>
    | <PRINT>
    | <SELECT>
    | <STATIC>
    | <IDENTIFIER>
  )*
  <EOF>
}
  

JavaCC解析器规则声明:

1。)直接字符串:

在这种情况下,您可以直接在解析器定义方法中使用该字符串,但这需要包含在double_quotes中。

 void start() : {}
  { "a" }

2。)使用词法规范部分中定义的令牌:

这里使用需要包含在尖括号内的词法标记来定义规则。

 TOKEN:{
      < A : "a" >
     } 
     void start() : {}
      { <A>}

3。)使用内联令牌定义:

在这里,我们可以在解析器规则定义中声明令牌。这是合法的,但会使语法的可读性降低。

void start() : {}
   { <A : "a" >}

4。)通过调用另一个解析器规则:

我们也可以通过调用下面的另一条规则来定义规则。

void start() : {}
  { A() }
void A() : {}
{ "a" }

希望这会有用......

答案 1 :(得分:-1)

也许是因为您使用了(...)*而且可能是(...)+因为*您说的是0次或多次。我认为这就是错误的原因。