JAVA CC 模式在预期的令牌上抛出错误

JAVA CC Pattern Throws an Error on an Expected Token

提问人:Eto 提问时间:9/23/2023 最后编辑:Jim GarrisonEto 更新时间:9/23/2023 访问量:33

问:

我在 JAVACC 中定义了以下模式:

| < CONFIGURATION_PATTERN: "(" ("\n")* (" ")* ((<LETTER>)+ " = " (<LETTER> | <DIGIT>)+ ("\n") (" ")*)+  (" ") ")" >
| < CONFIGURATION_SUB_PATTERN: "(" ("\n")* (" ")* ((<LETTER>)+ " = " (<LETTER> | <DIGIT> | <BOOLEAN>)+ ("\n") (" ")*)+  (" ") ")" >

然后,我有一个按预期解析的文件,但是当它到达以下行时,它会向我抛出一个错误:

*线条

CONFIGURATION (
    INSERTVALUE = 200
    PROPERTIES ( 
        MOVETABLE = false,
        DOWRITE = true
    )
)

抛出错误:

Parse error: Encountered " "(" "( "" at line 25, column 29.
Was expecting one of:
    "SOMETOKEN" ...
    "SOMETOKEN2" ...
    "SOMETOKEN3" ...
    <SOME_PATTERN> ...
    <SOME_PATTERN2> ...

我还有另一个文件,其中 PROPERTIES 部分不是文件的一部分,并且应用了 CONFIGURATION_PATTERN 和 CONFIGURATION_SUB_PATTERN,没有错误。

我试图调试这个,但我没有落后于错误,因为我不明白为什么它抱怨 CONFIGURATION 后面的第一个“(”。

我尝试删除 CONFIGURATION 部分,然后按预期解析整个文件。我试图显式设置“(”和“)”,但随后它抱怨它期望正确的模式。

我 chatgped 了这个问题,ChatGPT 告诉我应用一个递归模式,我尝试用 ,所以我把 .CONFIGURATION_SUB_PATTERN(<CONFIGURATION_PATTERN> | <CONFIGURATION_SUB_PATTERN>)*

之前,我尝试设置如下所示的模式,这对我来说看起来很丑陋,但应该是正确的:

"(" ("\n")* (" ")* ((<LETTER>)+ ("(" | " = ") ((<LETTER> | <DIGIT>)+ | ((<LETTER>)+ "=" (<BOOLEAN>)? (",")*)+ (")"))* ("\n") (" ")*)+ (" ") ")"

谢谢并感谢您的帮助!

java 解析 javacc javaparser javac-compiler-plugin

评论

2赞 Jim Garrison 9/23/2023
寻找空格和回车符的模式似乎混合了标记化和解析。这应该是两个不同的步骤,不应该混淆......那条路就是疯狂。
0赞 Eto 9/23/2023
我能想象你的意思,但你能更准确地说吗?您指的是删除任何带引号的令牌吗?应该删除“\n”还是“ ”?我同意,我只是在学习这一点
0赞 Jim Garrison 9/24/2023
不,您要完成的任务需要两步法。分词器将输入拆分为称为“标记”的有意义的位,忽略任何不携带任何语法信息的内容,例如不重要的空格。然后解析器只能处理“有趣”的东西。您需要阅读解析理论。
0赞 Eto 9/24/2023
我定义了 SKIP TOKENS,这只是一种模式,需要我以某种方式添加这些令牌。无论如何,关于我的问题的任何具体问题,我都会和你击掌
0赞 Eto 9/24/2023
我想我现在明白你的意思了......让我尝试一些东西,让你知道我是否通过你的提示解决了这个问题

答: 暂无答案