我正在使用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和其他网站上搜索过类似的问题,但没有发现任何可以回答我的问题。
答案 0 :(得分:0)
问题是SKIP生产仅适用于DEFAULT
状态。在关键字“list”之后,词法分析器切换到另一个状态。从JavaCC语法文件的JavaCC文档中,我们看到
有一种称为“DEFAULT”的标准词汇状态。如果是词汇 省略状态列表,正则表达式生成适用于 词汇状态“DEFAULT”。
修复是指定生产适用于所有词法状态。这是通过写
来完成的<*> SKIP: {
< " " | "\t" | "\r" | "\n" | "\r\n" >
| <"//" (~["\n","\r"])* ("\n"|"\r"|"\r\n") >
| <"/*"(~["/"])* "*""/" >
}
表示正则表达式生成适用于所有状态。