2017-12-27 337 views
0
"lexicale.l", line 13: unrecognized rule 
"lexicale.l", line 13: unrecognized rule 

的線13我無法找到該錯誤不可識別規則中的溶液

{idf} {printf("indetificateur\n");} 

的代碼是:

%{ 
    #include "stdio.h" 
    #include "stdlib.h" 
%} 
int [0-9]+ 
float [0-9]+("."[0-9]+)* 
bool 0 | 1 
idf [A-Z] ([0-9a-zA-Z] (_)? [0-9a-zA-Z]) {0,11} 
%% 
{int} {printf("int\n");} 
{float} {printf("float\n");} 
{bool} {printf("bool\n");} 
{idf} {printf("indetificateur\n");} 
.  {printf("erreur\n");} 

回答

1

(F)法圖案不能包含未引用的空白字符。

您的定義bool和您的定義idf都包含未加引號的空格。您應該從兩個定義中刪除空格。

由於flex解析其自己的輸入文件的方式有些怪異,報告模式定義中語法錯誤的行號並不十分準確。特別是,定義擴展時會報告錯誤,而不是定義時發生錯誤。而且,正如在這種情況下,錯誤通常在不正確的定義擴展後在線上報告。

總的來說,我個人發現定義沒有用處;在大多數情況下(如本例)沒有明顯的好處,實施中的怪異可能會導致混淆和意想不到的結果。

如果您正在使用Flex和你想使用的模式的空白,你可以環繞圖案(?x:…)設置「擴展語法」標誌:

idf (?x: [A-Z] ([0-9a-zA-Z] (_)? [0-9a-zA-Z]) {0,11}) 

順便說一句,你bool模式0 | 1可以更簡單地寫成[01]。但是,除非將規則放置在匹配int的規則之前,否則它將不會識別任何內容,因爲int規則肯定會匹配01,並且它會出現在文件的較早部分。 (這是規則的順序重要,而不是定義。這是由於不必要地使用定義而導致的另一種可能的混淆。)