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.1 和 openjdk 版本“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
我想解析 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.1 和 openjdk 版本“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