试图跳过JavaCC中的空格

时间:2014-08-21 19:35:20

标签: regex parsing lexical-analysis javacc

我正在使用Java Compiler Compiler编写一个词法分析器和解析器,我有一个SKIP无法处理空间的问题。跳过新行,制表符和注释就好了,但空格不行。我知道SKIP不会在令牌中工作,但是我不明白为什么我只有空格这个问题,而不是我试图跳过的任何其他问题。

这就是我的SKIP规范:

SKIP: {
< " " | "\t" | "\r" | "\n" | "\r\n" > //White space
| <"//" (~["\n","\r"])* ("\n"|"\r"|"\r\n") > //Single-line comments
| <"/*"(~["/"])*  "*""/" > //Multi-line comments
}

然后,后来,我有各种令牌。以下是其中一些例子。

<DEFAULT> TOKEN : { 
  < COMMAND : "list" > : IN_LIST_COMMAND
| < ID : (["A"-"Z","a"-"z"])+(["A"-"Z","a"-"z","0"-"9"])* >
| < NUMBER : (["0"-"9"])+ > 
...

这些工作正如我所希望的那样,除了其中一个之后有一个空格。例如,如果我试图给出

list [

到解析器,它会给我一个TokenManagerError,因为&#34; list&#34;跟着它有一个空格。

注意:我已经阅读了JavaCC的所有文档,我可以从主JavaCC网站和其他来源中找到。我也在StackOverflow和其他网站上搜索过类似的问题,但没有发现任何可以回答我的问题。

1 个答案:

答案 0 :(得分:0)

问题是SKIP生产仅适用于DEFAULT状态。在关键字“list”之后,词法分析器切换到另一个状态。从JavaCC语法文件的JavaCC文档中,我们看到

  

有一种称为“DEFAULT”的标准词汇状态。如果是词汇   省略状态列表,正则表达式生成适用于   词汇状态“DEFAULT”。

修复是指定生产适用于所有词法状态。这是通过写

来完成的
<*> SKIP: {
  < " " | "\t" | "\r" | "\n" | "\r\n" >
| <"//" (~["\n","\r"])* ("\n"|"\r"|"\r\n") >
| <"/*"(~["/"])*  "*""/" >
}

表示正则表达式生成适用于所有状态。