Node.js 如何在ANTLR中正确编写带lookback的规则

Node.js 如何在ANTLR中正确编写带lookback的规则,node.js,antlr,antlr4,Node.js,Antlr,Antlr4,我正在努力根据前面的符号为解析规则添加功能。为了更清楚,让我来描述一下这个案例 目前我正在解析VBLike脚本。有一些特定的情况下,行继续符号。通常,它看起来像: If Foo = "X" And _ Bar = "Y" And _ FooBar = "XY" Or _ BarFoo = "YX" Then Bar = "far" End If // this one is short to make it more readable 然而,在某些情况下,行连续

我正在努力根据前面的符号为解析规则添加功能。为了更清楚,让我来描述一下这个案例

目前我正在解析VBLike脚本。有一些特定的情况下,行继续符号。通常,它看起来像:

If Foo = "X" And _
    Bar = "Y" And _
    FooBar = "XY" Or _
    BarFoo = "YX" Then
    Bar = "far"
End If
// this one is short to make it more readable
然而,在某些情况下,行连续符号不仅由
符号组成,而且由
&
组合组成。为此,对
.g4
文件中的规则进行了一些修改:

LINE_CONTINUATION
    : WS* ((AMPERSAND WS)? '_') WS? '\r'? '\n' -> skip
    ;
它似乎工作得很好,解析这样的案例:

If Foo = "X" And & _
    Bar = "Y" And & _
    FooBar = "XY" Or _
    BarFoo = "YX" Then
    Bar = "far"
End If
If BasicChargeChkExst = Checked Then
    strTemp = "My Little" & _
              "Pony"
End If
但是,当我们遇到一个问题时,我们不得不用行继续和字符串连接来解析脚本(在VB中,我们可以用
&
连接字符串)。看起来是这样的:

If Foo = "X" And & _
    Bar = "Y" And & _
    FooBar = "XY" Or _
    BarFoo = "YX" Then
    Bar = "far"
End If
If BasicChargeChkExst = Checked Then
    strTemp = "My Little" & _
              "Pony"
End If
问题是,对于当前情况,
&
被认为是行延续的一部分,如现在所述,但是如果我们在
&
之前有字符串文字,我们不应该在
行延续中包含
&

所以,总而言之,我应该更新
LINE\u CONTINUATION
规则,使其以这种方式工作:

If Foo = "X" And _ ... // -> consider '_' as line continuation here

If Foo = "X" And & _ // consider '& _' as line continuation here because we have NOT a String literal before & (And, maybe any other keyword or something else)

str = "First part of string" & _ ... // should consider only '_' as line continuation because we have string before '&'
我明白,这样的假设并不十分安全,但它们涵盖了大多数情况,即使这样,我也不会介意

我只需要更新
LINE\u CONTINUATION
就可以解决这种情况。我正在使用node.js和antlrv4.7.0。正如我所提到的,目前看起来:

LINE_CONTINUATION
    : WS* ((AMPERSAND WS)? '_') WS? '\r'? '\n' -> skip
    ;

...

STRINGLITERAL
    : '"' (~ ["\r\n] | '""')* '"'
    ;
此外,在“玩”这条规则时,我试图为它添加替代方案,但似乎它没有按照我预期和理解的方式工作。当我这样做的时候:

LINE_CONTINUATION
    : WS* ((AMPERSAND WS)? '_') WS? '\r'? '\n' -> skip
    | ... Something here
    ;
我收到错误消息:
->lexer规则行中的命令\u CONTINUATION必须是单个最外层alt的最后一个元素。如果有人能解释我的错误那就太好了。我们需要跳过行的延续,但是备选方案有什么错呢

我在这件事上真的搞砸了。不幸的是,我没有太多时间深入研究ANTLR,因此我将非常感谢任何建议/代码帮助/有用的链接或任何其他可能有帮助的内容


提前谢谢。

如果我答对了你的问题,
&
可以是行继续或字符串连接的一部分,这让我认为
&
的真正目的可以根据当前上下文确定。这似乎是解析器的工作,而不是词法分析器的工作。您可以尝试声明两个标记:
&
而不是
行继续
,然后在解析器中,根据当前上下文(无论是连接字符串还是行),确定
&
标记的含义并相应地处理它。我建议不要处理文件级(或预处理)解析器级别的问题。行继续(或宏替换等)最好在预处理步骤中处理。创建自己的char输入流,该流处理诸如concatating行之类的事情,并将其提供给解析器。使处理变得容易得多。