使用antlr4对matlab语法进行注释



谁能帮我解决这两个问题?

第一个几乎为我解决了matlab中多行注释的问题正则表达式,但我不知道我应该如何使用^.*%{(?:R(?!.*%{).*)*Rh*%}$或语法中的位置,如果我想使用antlr4。我一直在使用matlab语法从这个源。

第二个与matlab中的另一种注释有关,即a = 3 % type any ascii I want...。在这种情况下,当我以以下形式插入标签替代规则上下文unary_expression时:

unary_expression
: postfix_expression
| unary_operator postfix_expression
| postfix_expression COMMENT
;

,其中COMMENT: '%' [ a-zA-Z0-9]*;,但当我使用[x00-x7F]而不是[ a-zA-Z0-9]*(我在这里发现的)解析出错时,参见下面的示例:

INPUT FOR PARSER: a = 3 %  $£ K JFKL£J"!"OIJ+2432 3K3KJ£$K M£"Kdsa
ANTLR OUTPUT : Exception in thread "main" java.lang.RuntimeException: set is empty
at org.antlr.v4.runtime.misc.IntervalSet.getMaxElement(IntervalSet.java:421)
at org.antlr.v4.runtime.atn.ATNSerializer.serialize(ATNSerializer.java:169)
at org.antlr.v4.runtime.atn.ATNSerializer.getSerialized(ATNSerializer.java:601)
at org.antlr.v4.Tool.generateInterpreterData(Tool.java:745)
at org.antlr.v4.Tool.processNonCombinedGrammar(Tool.java:400)
at org.antlr.v4.Tool.process(Tool.java:361)
at org.antlr.v4.Tool.processGrammarsOnCommandLine(Tool.java:328)
at org.antlr.v4.Tool.main(Tool.java:172)
line 1:9 token recognition error at: '$'
line 1:20 token recognition error at: '"'
line 1:21 token recognition error at: '!'
line 1:22 token recognition error at: '"'
line 1:38 token recognition error at: '$'
line 1:43 token recognition error at: '"'
line 1:10 missing {',', ';', CR} at 'L'
line 1:32 missing {',', ';', CR} at '3'
有谁能告诉我我做错了什么吗?解决这个问题的最佳实践是什么?(我不完全是正则表达式的人…)

让我们先看一个简单的

这看起来(对我来说)像一个典型的"注释,直到行尾"评论。

假设我是正确的,那么最好不要考虑可能包含的所有有效字符是什么,而是考虑不使用的字符。

Try:COMMENT: '%' ~[rn]* 'r'? 'n';

(我注意到您的规则中没有包含任何在行尾终止它的内容,所以我添加了它)。

这基本上是说:一旦我看到%消耗所有不是r或' nand stop when you see an optionrfollowed by a requiredn'的东西。

一般来说,注释可以出现在语法结构中的任何地方,所以"把注释推到一边"非常有用。而不是在语法中允许它们的任何地方注入它们。

一个简短的语法:

grammar test
;
test: ID EQ INT;
EQ:      '=';
INT:     [0-9]+;
COMMENT: '%' ~[rn]* 'r'? 'n' -> channel(HIDDEN);
ID:      [a-zA-Z]+;
WS:      [ trn]+ -> skip;

您会注意到我从test规则中删除了COMMENT元素。

测试文件:

a = 3 %  $£ K JFKL£J"!"OIJ+2432 3K3KJ£$K M£"Kdsa

(一定要包括n)

➜ grun test test -tree -tokens < test.txt
[@0,0:0='a',<ID>,1:0]
[@1,2:2='=',<'='>,1:2]
[@2,4:4='3',<INT>,1:4]
[@3,6:48='%  $£ K JFKL£J"!"OIJ+2432 3K3KJ£$K M£"Kdsan',<COMMENT>,channel=1,1:6]
[@4,49:48='<EOF>',<EOF>,2:0]
(test a = 3)

你仍然得到一个COMMENT标记,它只是在匹配解析器规则时被忽略。

现在对于多行注释:

ANTLR使用了类似于"regex的"Lexer规则的语法,但是,不要被愚弄,它不是(它实际上更强大,因为它可以对嵌套括号等进行配对)

快速阅读,MatLab多行令牌从%{开始,并消耗所有内容,直到%}. This is very similar to the prior rule, it just doesn't care aboutrorn '),因此:

MLCOMMENT: '%{' .*? '%}'    -> channel(HIDDEN);

包含在语法中:

grammar test
;
test: ID EQ INT;
EQ:        '=';
INT:       [0-9]+;
COMMENT:   '%' ~[rn]* 'r'? 'n' -> channel(HIDDEN);
MLCOMMENT: '%{' .*? '%}'           -> channel(HIDDEN);
ID:        [a-zA-Z]+;
WS:        [ trn]+ -> skip;

输入文件:

a = 3 %  $£ K JFKL£J"!"OIJ+2432 3K3KJ£$K M£"Kdsa
%{
A whole bunch of stuff
on several
lines
%}
➜ grun test test -tree -tokens < test.txt
[@0,0:0='a',<ID>,1:0]
[@1,2:2='=',<'='>,1:2]
[@2,4:4='3',<INT>,1:4]
[@3,6:48='%  $£ K JFKL£J"!"OIJ+2432 3K3KJ£$K M£"Kdsan',<COMMENT>,channel=1,1:6]
[@4,50:106='%{n    A whole bunch of stuffn    on severaln    linesn%}',<MLCOMMENT>,channel=1,3:0]
[@5,108:107='<EOF>',<EOF>,8:0]
(test a = 3)