怎麼能否定元字符,~
,可以在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. 語法高亮規則和定義
- 6. URL語法規則
- 7. Jess:用「not」語法定義規則
- 8. 的Xtext與規則ovewrite和語法inheretance
- 9. 規則在C++異常的語法和
- 10. 命名變量是否有特定的語法規則?
- 11. TeX方程的Lexer規則(正則表達式)
- 12. C++ typedef語法規則
- 13. Treetop忽略語法規則
- 14. 驗證規則語法
- 15. 業務規則Xtext語法
- 16. 評論的語法規則
- 17. 運用語法規則
- 18. 奇怪ANTLR語法規則
- 19. 工具從語法規則
- 20. 語法規則分析
- 21. 出站規則不裏面的UpdatePanel
- 22. 方案:定義語法規則的模式匹配語法
- 23. ActiveSupport的英語多元化規則在哪裏定義?
- 24. Textmate在哪裏找到它的語法檢查規則?
- 25. C#:英語語法規則引擎?
- 26. yacc語法規則的語義
- 27. IPython語法Lexer for Latex Minted Package
- 28. FHIR資源規則; FHIR規則管理和規則定義
- 29. 頁面特定的CSS規則 - 把它們放在哪裏?
- 30. 是否可以從ANTLR生成的Lexer和Parser文件生成語法文件?
感謝您的澄清。我不知道在解析器規則中出現'〜'運算符會應用於標記。 – Gunther
@Gunther,沒問題。我經常在我的答案中提到它,所以從現在起我可以鏈接到這個問答。 W.r.t.你的轉換器,也許你已經在使用它,但可能不是:'org.antlr.tool.Strip'類從ANTLR語法文件中刪除所有的自定義代碼,這可能會讓你在解析ANTLR語法時更容易。 –