使用 antlr4 包括对 matlab 语法的注释
Include commentary to the matlab grammar using antlr4
有人可以帮我解决这两个问题吗?
问题 , but I do not know how exactly I should use ^.*%\{(?:\R(?!.*%\{).*)*\R\h*%\}$
or where in grammar if I want use is with antlr4. I have been using matlab grammar from this 来源几乎为我解决了第一个问题。
第二个与 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]*
(我发现 here)时解析出错,请参见下面的示例:
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'
谁能告诉我我做错了什么?这个问题的最佳实践是什么? (我不是正则表达式专家...)
先说简单的吧
这看起来(对我来说)就像一个典型的“在行尾对所有内容进行评论”的评论。
假设我是对的,那么最好不要考虑可能包含的所有有效字符是什么,而是考虑不要使用什么。
尝试:COMMENT: '%' ~[\r\n]* '\r'? '\n';
(我注意到您没有在规则中包含任何内容以在行尾终止它,所以我添加了它)。
这基本上是说:一旦我看到 %
消耗所有不是 \r
或 `nand stop when you see an option
\rfollowed by a required
\n' 的东西。
通常,注释几乎可以出现在语法结构中的任何地方,因此“将注释推到一边”非常有用,而不是将它们注入语法中允许它们出现的任何地方。
所以,一个简短的语法:
grammar test
;
test: ID EQ INT;
EQ: '=';
INT: [0-9]+;
COMMENT: '%' ~[\r\n]* '\r'? '\n' -> channel(HIDDEN);
ID: [a-zA-Z]+;
WS: [ \t\r\n]+ -> 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£"Kdsa\n',<COMMENT>,channel=1,1:6]
[@4,49:48='<EOF>',<EOF>,2:0]
(test a = 3)
你仍然会得到一个 COMMENT
标记,它只是在匹配解析器规则时被忽略。
现在多行注释:
ANTLR 对 Lexer 规则使用了一种相当“类似正则表达式”的语法,但是,不要被愚弄,它不是(它实际上更强大,因为它可以配对嵌套括号等)
通过快速阅读,MatLab 多行标记以 %{
开始并消耗所有内容,直到 %}. This is very similar to the prior rule, it just doesn't care about
\ror
\n`),所以:
MLCOMMENT: '%{' .*? '%}' -> channel(HIDDEN);
包含在语法中:
grammar test
;
test: ID EQ INT;
EQ: '=';
INT: [0-9]+;
COMMENT: '%' ~[\r\n]* '\r'? '\n' -> channel(HIDDEN);
MLCOMMENT: '%{' .*? '%}' -> channel(HIDDEN);
ID: [a-zA-Z]+;
WS: [ \t\r\n]+ -> 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£"Kdsa\n',<COMMENT>,channel=1,1:6]
[@4,50:106='%{\n A whole bunch of stuff\n on several\n lines\n%}',<MLCOMMENT>,channel=1,3:0]
[@5,108:107='<EOF>',<EOF>,8:0]
(test a = 3)
有人可以帮我解决这两个问题吗?
问题 ^.*%\{(?:\R(?!.*%\{).*)*\R\h*%\}$
or where in grammar if I want use is with antlr4. I have been using matlab grammar from this 来源几乎为我解决了第一个问题。
第二个与 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]*
(我发现 here)时解析出错,请参见下面的示例:
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'
谁能告诉我我做错了什么?这个问题的最佳实践是什么? (我不是正则表达式专家...)
先说简单的吧
这看起来(对我来说)就像一个典型的“在行尾对所有内容进行评论”的评论。
假设我是对的,那么最好不要考虑可能包含的所有有效字符是什么,而是考虑不要使用什么。
尝试:COMMENT: '%' ~[\r\n]* '\r'? '\n';
(我注意到您没有在规则中包含任何内容以在行尾终止它,所以我添加了它)。
这基本上是说:一旦我看到 %
消耗所有不是 \r
或 `nand stop when you see an option
\rfollowed by a required
\n' 的东西。
通常,注释几乎可以出现在语法结构中的任何地方,因此“将注释推到一边”非常有用,而不是将它们注入语法中允许它们出现的任何地方。
所以,一个简短的语法:
grammar test
;
test: ID EQ INT;
EQ: '=';
INT: [0-9]+;
COMMENT: '%' ~[\r\n]* '\r'? '\n' -> channel(HIDDEN);
ID: [a-zA-Z]+;
WS: [ \t\r\n]+ -> 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£"Kdsa\n',<COMMENT>,channel=1,1:6]
[@4,49:48='<EOF>',<EOF>,2:0]
(test a = 3)
你仍然会得到一个 COMMENT
标记,它只是在匹配解析器规则时被忽略。
现在多行注释:
ANTLR 对 Lexer 规则使用了一种相当“类似正则表达式”的语法,但是,不要被愚弄,它不是(它实际上更强大,因为它可以配对嵌套括号等)
通过快速阅读,MatLab 多行标记以 %{
开始并消耗所有内容,直到 %}. This is very similar to the prior rule, it just doesn't care about
\ror
\n`),所以:
MLCOMMENT: '%{' .*? '%}' -> channel(HIDDEN);
包含在语法中:
grammar test
;
test: ID EQ INT;
EQ: '=';
INT: [0-9]+;
COMMENT: '%' ~[\r\n]* '\r'? '\n' -> channel(HIDDEN);
MLCOMMENT: '%{' .*? '%}' -> channel(HIDDEN);
ID: [a-zA-Z]+;
WS: [ \t\r\n]+ -> 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£"Kdsa\n',<COMMENT>,channel=1,1:6]
[@4,50:106='%{\n A whole bunch of stuff\n on several\n lines\n%}',<MLCOMMENT>,channel=1,3:0]
[@5,108:107='<EOF>',<EOF>,8:0]
(test a = 3)