有人可以幫我解決這兩個問題嗎?
第一個幾乎為我解決了matlab 中多行評論的問題正則運算式,但我不知道我應該如何使用^.*%\{(?:\R(?!.*%\{).*)*\R\h*%\}$或語法中的哪里如果我想使用 antlr4。我一直在使用這個來源的matlab 語法。
第二個與 matlab 中的另一種型別的評論有關,即a = 3 % type any ascii I want.... 在這種情況下,當我以這種形式插入規則背景關系 unary_expression 的替代標簽時:
unary_expression
: postfix_expression
| unary_operator postfix_expression
| postfix_expression COMMENT
;
where 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'
誰能告訴我我做錯了什么?這個問題的最佳實踐是什么?(我不完全是正則運算式的人......)
uj5u.com熱心網友回復:
我們先說簡單的。
這看起來(對我來說)就像一個典型的“在行尾評論所有內容”評論。
假設我是正確的,那么最好不要考慮可能包含的所有有效字符是什么,而是考慮不消耗什么。
嘗試: COMMENT: '%' ~[\r\n]* '\r'? '\n';
(我注意到你沒有在你的規則中包含任何東西來在行尾終止它,所以我已經添加了)。
這基本上是說:一旦我看到 a%消費所有不是 a\r或 `n and stop when you see an option\r followed 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;
您會注意到我COMMENT從test規則中洗掉了該元素。
測驗檔案:
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 規則使用了一種相當“regex-like”的語法,但是,不要被愚弄,它不是(它實際上更強大,因為它可以配對嵌套括號等)
通過快速閱讀,MatLab 多行標記以 a 開頭%{并消耗所有內容,直到%}. This is very similar to the prior rule, it just doesn't care about \r or\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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/339555.html
