Node.js 如何在ANTLR中正确编写带lookback的规则
我正在努力根据前面的符号为解析规则添加功能。为了更清楚,让我来描述一下这个案例 目前我正在解析VBLike脚本。有一些特定的情况下,行继续符号。通常,它看起来像: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 然而,在某些情况下,行连续
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行之类的事情,并将其提供给解析器。使处理变得容易得多。