[英]Antlr4 Match anything (including multiple lines) between tokens
我想解析 markdown 代码块,但我似乎无法正确理解规则,因此它正确匹配多行。
这是我的语法(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 ```)
我希望它将整个代码块匹配为一个标记,以便我可以将其解析为一个 stream 字节。 我的语法中缺少什么?
(我使用的是Antrl 4.10.1和openjdk 版本“11.0.15”2022-04-19 。)
您只在反引号之间定义了一个CODE
标记。 您需要一个或多个CODE
代币:
code: '```' CODE+ '```';
也就是说,使用像 ANTLR 这样的工具解析 Markdown(词法分析器和解析器规则之间存在严格的分离)将非常困难。 参见: https://github.com/antlr/grammars-v4/issues/472
您的CODE
Lexer 规则仅匹配小写的“a”-“z”字符。 它不会匹配任何其他字符或空格(包括换行符和回车符)。
也就是说,仅仅纠正 Lexer 规则并不能解决您的问题。 您需要查看词法分析器模式,然后,当您遇到in the outer mode, you can switch to the inner mode and matching anything (non-greedily `.*?`) followed by
您“弹出词法分析器模式”的位置。
(我很确定 ``` 需要位于一行的开头,因此您还需要一个谓词来仅在它们位于一行的开头时匹配它们。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.