2014-04-02 25 views
0

我有一個similar question,但有一點區別。我想分析下面的模式:如何區分標識符和字符串?

ID = STRING 

注意STRING沒有報價。 ID和STRING之間的差別是ID只能以char和下劃線開頭,STRING沒有這樣的約束。區分標識符和字符串,彎曲或野牛的更好的地方在哪裏?

+0

這是flex的工作。 – Josh

+1

你讓自己難過。有一個原因是字符串通常在引號中;它使生活更輕鬆。如果'a_97 = a_97'需要將第一個作爲ID,第二個作爲STRING,則必須使用解析器的語義反饋對上下文敏感。你可以決定是否允許'STRING = STRING'並強制進行語義檢查,以確定LHS上的字符串應該是一個ID;這應該讓生活變得更容易一些(但要注意不明確的語法)。您可能更喜歡創建一個規則:'id:STRING',它檢查該字符串是否是有效的標識符,並使用'id = STRING'。 –

回答

1

在flex中,如果輸入匹配兩個模式,則首選模式。所以你可以寫,例如:

[[:alpha:]]_[[:alnum:]_]+ { yylval = strdup(yytext); return ID; } 
[[:alnum:]_]+    { yylval = strdup(yytext); return STRING; } 

和第一條規則將用於輸入像a_97(其中兩個圖案匹配)來執行,而第二個將像97_a輸入來執行(其中第一圖案沒有按」 t匹配)。

1

a_97 = a_97爲例。問題是我將得到令牌序列:ID,'=',ID,這是語法規則ID = STRING所不能接受的。我決定把它們當作STRING,然後把支票留在野牛身邊。