ANTLR-检查字符串';s";“建设”;

ANTLR-检查字符串';s";“建设”;,antlr,antlr4,Antlr,Antlr4,目前正在与ANTLR合作,发现了一些有趣的事情,但并没有按照我的预期工作 我试着在我的语法中按照“test10cm”的思路运行一些东西,但失败了,然而“test10cm”的工作原理与前面的一样。代码中的“cm”部分是我在语法中所说的“wholeunit”,如下所示: wholeunit : siunit | unitmod siunit | wholeunit NUM | wholeunit

目前正在与ANTLR合作,发现了一些有趣的事情,但并没有按照我的预期工作

我试着在我的语法中按照“test10cm”的思路运行一些东西,但失败了,然而“test10cm”的工作原理与前面的一样。代码中的“cm”部分是我在语法中所说的“wholeunit”,如下所示:

wholeunit   :
              siunit
            | unitmod siunit
            | wholeunit NUM
            | wholeunit '/' wholeunit
            | wholeunit '.' wholeunit
            ;
它现在正在做的是规则的“unitmod siunit”部分,其中unitmod=c和siunit=m。 我想知道的是,我怎样才能使语法仍然遵循“UNITMOD SIONE”的规则,而不需要中间的空间,我可能会丢失一些巨大的东西。(是的,我将空格和制表符标记为跳过)

可能的原因是“cm”被视为另一个标记(可能与“test”相同的标记类型),而不是“c”和“m”作为单独的标记

请记住,在ANTLR lexer中,匹配最长输入的规则获胜

一种解决方案可能是使
wholeunit
成为词法规则,而不是解析器规则,并确保它高于匹配任何单词的规则(如“test”)-如果同一输入可以由多个规则匹配,ANTLR将按定义规则的顺序选择第一个规则。

可能的原因是“cm”同时被视为另一个令牌(可能与“test”相同的令牌类型),而不是将“c”和“m”作为单独的令牌

请记住,在ANTLR lexer中,匹配最长输入的规则获胜


一个解决方案可能是将
wholeunit
设置为词法规则,而不是解析器规则,并确保它高于匹配任何单词的规则(如“test”)-如果同一输入可以由多个规则匹配,ANTLR会选择第一个规则,以它们在中定义的顺序。

我尝试将其更改为词法规则,但它不起作用。我认为它工作的唯一方法是使siunit和unitmod成为lexer规则,但是存在输入为“mm”的问题。当然,lexer规则不能引用解析器规则,它们都必须是lexer规则。如果
siunit
unitmod
是一个片段词法规则,那么mm案例可能仍然有效。或者考虑在解析之后解析这个问题,即解析单元作为一个共同的“单词”,然后在解析完成后检查它是否允许单位名称。我试着把它改成一个词汇规则,但它不起作用。我认为它工作的唯一方法是使siunit和unitmod成为lexer规则,但是存在输入为“mm”的问题。当然,lexer规则不能引用解析器规则,它们都必须是lexer规则。如果
siunit
unitmod
是一个片段词法规则,那么mm案例可能仍然有效。或者考虑只在解析之后解析这个问题,即解析单元作为一个共同的“字”,然后在解析完成后检查它是否允许单位名称。