怎麼能否定元字符,~
,可以在ANTLR的lexer-和語法規則使用?否定裏面lexer-和語法規則
14
A
回答
23
否定可以在裏面lexer and parser rules發生。
內部詞法規則,你可以否定字符,語法規則裏面,你可以否定令牌(詞法規則)。但是詞法分析器和分析器規則只能分別否定單個字符或單個標記。
幾個例子:
詞法規則
要匹配除了小寫ASCII字母一個或多個字符,你可以這樣做:
NO_LOWERCASE : ~('a'..'z')+ ;
(否定-元字符, ~
,優先級高於+
,所以上述規則等於(~('a'..'z'))+
)
注意'a'..'z'
匹配單個字符(可以爲此被否定),但下面的規則是無效的:
ANY_EXCEPT_AB : ~('ab') ;
因爲'ab'
(顯然)匹配2個字符,也不能否定。爲了匹配由2個字符的道理,但不是'ab'
,你必須做到以下幾點:
ANY_EXCEPT_AB
: 'a' ~'b' // any two chars starting with 'a' followed by any other than 'b'
| ~'a' . // other than 'a' followed by any char
;
語法規則
裏面的語法規則,~
否定一定道理,或一個以上令牌。例如,您有以下標記定義:
A : 'A';
B : 'B';
C : 'C';
D : 'D';
E : 'E';
如果你現在想匹配任何令牌除了A
,你這樣做:
p : ~A ;
如果你想匹配任何令牌除了B
和D
,你可以這樣做:
p : ~(B | D) ;
但是,如果你想匹配比A
其他任何兩個令牌隨後B
,你不能做:
p : ~(A B) ;
正如詞法規則,你不能否定多單令牌等等。爲了實現上述情況,你需要做的:
P
: A ~B
| ~A .
;
注意,在解析器規則.
(DOT)字符不不比賽,因爲它確實詞法規則內的任何字符。裏面的語法規則,它的任何令牌(A
,B
,C
,D
或E
,在這種情況下)相匹配。
注意,你不能否定的語法規則。以下是非法的:
p : ~a ;
a : A ;
相關問題
- 1. ANTL 4 Lexer規則無法在組合語法中識別
- 2. Lexer規則的句子
- 3. 'IDENTIFIER'規則也消耗ANTLR Lexer語法中的關鍵字
- 4. 解析器/ Lexer忽略不完整的語法規則
- 5. 的Xtext與規則ovewrite和語法inheretance
- 6. 業務規則Xtext語法
- 7. 方案:定義語法規則的模式匹配語法
- 8. 出站規則不裏面的UpdatePanel
- 9. ActiveSupport的英語多元化規則在哪裏定義?
- 10. Textmate在哪裏找到它的語法檢查規則?
- 11. C#:英語語法規則引擎?
- 12. 頁面特定的CSS規則 - 把它們放在哪裏?
- 13. ocaml的詞法/語法規則
- 14. 是否可以從ANTLR生成的Lexer和Parser文件生成語法文件?
- 15. Lexer規則被識別爲不需要的地方
- 16. Lexer規則中沒有量詞的括號是什麼?
- 17. 語義規則/抽象句法樹規則
- 18. 從哪裏獲得EPUB語法規範?
- 19. heredoc裏面的Ruby語法?
- 20. Java語言規範是否規定了在子類中重寫方法的規則?
- 21. 是否可以堆棧Yacc語法規則代碼?
- 22. Antlr4:如何退出語法規則? 。
- 23. 關於owasp規則的語法錯誤
- 24. JavaScript語法:for/for-in循環規則?
- 25. ANTLR4片段對語法規則
- 26. drools嵌套類的規則語法
- 27. TextMate語法 - 規則的優先級
- 28. URL重寫規則語法問題
- 29. 野牛的if/else語法規則
- 30. ANTLR Lua長字符串語法規則
感謝您的澄清。我不知道在解析器規則中出現'〜'運算符會應用於標記。 – Gunther
@Gunther,沒問題。我經常在我的答案中提到它,所以從現在起我可以鏈接到這個問答。 W.r.t.你的轉換器,也許你已經在使用它,但可能不是:'org.antlr.tool.Strip'類從ANTLR語法文件中刪除所有的自定義代碼,這可能會讓你在解析ANTLR語法時更容易。 –