Antlr4 匹配标记之间的任何内容(包括多行)

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 ```)

我希望它将整个代码块匹配为一个标记,这样我就可以将其解析为一个字节流。我的语法遗漏了什么?

(我正在使用 Antrl 4.10.1openjdk 版本“11.0.15”2022-04-19。)

您的 CODE 词法分析器规则仅匹配小写的“a”-“z”字符。它不会匹配任何其他字符或空格(包括换行符和回车符returns)。

就是说,仅仅更正 Lexer 规则并不能解决您的问题。你需要研究词法分析器模式,然后,当你遇到 in the outer mode, you can switch to the inner mode and matching anything (non-greedily `.*?`) followed by 时你会弹出你的词法分析器模式。

(我很确定 ``` 需要位于一行的开头,因此您还需要一个谓词来仅在它们位于一行的开头时匹配它们。 )

您只在 back-ticks 之间定义了一个 CODE 标记。您需要一个或多个 CODE 个代币:

code: '```' CODE+ '```';

也就是说,使用像 ANTLR 这样的工具(词法分析器和解析器规则之间有严格的区分)来解析 Markdown 会非常困难。参见:https://github.com/antlr/grammars-v4/issues/472