![](/img/trans.png)
[英]ANTLR 4 - Grammar Rule for string to support whitespace and special char
[英]Whitespace separation in jflex grammar
假設我需要簡單的語法來描述類似
foo 2
bar 21
但不是
foo1
使用jflex我寫了像
WORD=[a-zA-Z]+
NUMBER=[0-9]+
WHITE_SPACE_CHAR=[\ \n\r\t\f]
%state AFTER_WORD
%state AFTER_WORD_SEPARATOR
%%
<YYINITIAL>{WORD} { yybegin(AFTER_WORD); return TokenType.WORD; }
<AFTER_WORD>{WHITE_SPACE_CHAR}+ { yybegin(AFTER_WORD_SEPARATOR); return TokenType.WHITE_SPACE; }
<AFTER_WORD_SEPARATOR>{NUMBER} { yybegin(YYINITIAL); return TokenType.NUMBER; }
{WHITE_SPACE_CHAR}+ { return TokenType.WHITE_SPACE; }
但是我不喜歡用來說單詞和數字之間應該有空格的多余狀態。 如何簡化語法?
解析時根本不需要空格令牌。
擺脫TokenType.WHITE_SPACE
,當您在詞法分析器中獲得空白時,只需忽略它而不返回任何內容。
為了防止'foo1'
,請為[A-Za-z0-9]
添加另一個規則,並為其添加一個不在語法中顯示的令牌類型; 那就是語法錯誤。
根據我對JFlex的了解,如果您能完全識別空格(似乎是這種情況),則不必使用額外的狀態。 只需為“標識符”制定一條規則,為“數字”制定另一條規則。
%%
{WORD} { return TokenType.WORD; }
{NUMBER} { return TokenType.NUMBER; }
如果您的語言要求每一行都由一個標識符,一個空格和一個數字組成,則應通過句法分析(即解析器)而不是詞法分析來檢查。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.