【问题标题】:JavaCC lookahead acting different, not choosing the correct method to parseJavaCC 前瞻行为不同,没有选择正确的解析方法
【发布时间】:2018-12-17 21:58:05
【问题描述】:

我是 JavaCC 的新手,并且已经阅读了多个前瞻教程。然而,在一个简单的语法文件上测试前瞻时让我感到困惑。在这个语法文件中我只是做了两个解析规则,1->double,2->integers。

如果输入适合上下文,程序应该选择它们。

options
{
  STATIC =false;
  debug_parser = true;
  debug_lookahead = true;
}

PARSER_BEGIN(testin)
public class testin
{
    public void parse() throws ParseException
    {
        testin b = new testin(System.in);
        b.go();
    }
}
PARSER_END(testin)

TOKEN:
{
//testing lookahead
<NUMBER : (["0"-"9"])+>|
<DOT : ".">
}


void go()
:
{}
{

LOOKAHEAD(2) doub() | number()
}

void doub()
:
{
Token bool;
}
{
bool = <NUMBER><DOT><NUMBER>
{
    System.out.println(Double.parseDouble(bool.image));
}
} 

void number()
:
{
Token mo;
}
{
mo = <NUMBER>
{
    System.out.println(Integer.parseInt(mo.image));
}
} 

在使用小数输入输入时使用此代码进行测试后,它可以工作,但是当使用整数输入时它不会并且它不会输出任何内容。这是调试输出:

Call:   go
Call:   doub(LOOKING AHEAD...)
75
   Visited token: <<NUMBER>: "75" at line 1 column 1>; Expected token:<<NUMBER>>

【问题讨论】:

  • 在 75 之后返回。这应该会导致 TokenManagerError 被抛出。你确定你的程序没有抛出任何异常吗?

标签: java parsing javacc lookahead


【解决方案1】:

尝试指定空白字符:

SKIP : {
    < " " | "\t" | "\r" | "\n" >
}

另外,请尝试指定 &lt;EOF&gt; 的预期位置:

void go()
:
{}
{
(LOOKAHEAD(2) doub() | number())
<EOF>
}

【讨论】:

  • 嗯,不行,好像解析器直接进入了doub()方法。
  • @Pun3rs 是的,但如有必要,它会回溯。
  • @Pun3rs 另外,我认为您应该在词法级别区分整数和双精度数;即定义两个标记,
  • 是的,我知道,但我故意这样做是为了学习 Lookahead 系统。所以在未来的情况下,我可以实现 Lookahead 系统。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 2012-01-10
  • 2020-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多