我想決議降價代碼塊,但我似乎無法正確獲取規則,因此它正確匹配多行。
這是我的語法(code.g4):
grammar code;
file: code ;
code: '```' CODE '```';
CODE: [a-z] ;
EOL: '\r'? '\n' -> skip;
這是我的輸入(code.txt):
```
foo
foo
```
```
bar
bar
```
```
baz
baz
```
當我運行時java org.antlr.v4.gui.TestRig code file -tree code.txt,我得到:
line 3:0 extraneous input 'foo' expecting '```'
line 8:0 extraneous input 'bar' expecting '```'
line 13:0 extraneous input 'baz' expecting '```'
(file (code ``` foo foo ```) (code ``` bar bar ```) (code ``` baz baz ```)
我希望它把整個代碼塊作為一個標記來匹配,這樣我就可以將它決議為一個位元組流。我的語法中缺少什么?
(我使用的是Antrl 4.10.1和openjdk 版本 "11.0.15" 2022-04-19。)
uj5u.com熱心網友回復:
您在CODE反引號之間只定義了一個標記。您需要一個或多個CODE令牌:
code: '```' CODE '```';

也就是說,使用 ANTLR 之類的工具(詞法分析器和決議器規則之間有嚴格的分離)來決議 Markdown 將非常困難。見:https ://github.com/antlr/grammars-v4/issues/472
uj5u.com熱心網友回復:
您的CODELexer 規則僅匹配小寫的 'a'-'z' 字符。它不會匹配任何其他字符或空格(包括換行符和回車符)。
也就是說,僅僅糾正 Lexer 規則并不能解決您的問題。in the outer mode, you can switch to the inner mode and matching anything (non-greedily `.*?`) followed by然后,當您遇到“彈出詞法分析器模式”的位置時,您需要查看 Lexer Modes 。
(我很確定 ``` 需要位于行首,因此您還需要一個謂詞來僅在它們位于行首時才匹配它們。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/473575.html
