2016-06-09 39 views
2

我正在用flex和野牛來修補,以創建一個小型計算器程序。令牌將是這樣的:如何在正則表達式中指定一個特定的字符串

read A 
read B 

sum := A + B 
write sum 

讀,寫將關鍵字指示讀取值或寫入輸出值。 「:=」是賦值運算符。 A,B是標識符,可以是字符串。還會有評論//comment和塊註釋/* asdfsd */

請問這些正則表達式是否正確以指定我指定的小文法?

[:][=] //assignment operator 
[ \t]  //skipping whitespace 
[a-zA-Z0-9]+  //identifiers 
[Rr][Ee][Aa][Dd] //read symbols, not case-sensitive 
[/][/]   `//comment` 

對於賦值運算符和註釋正則表達式,我可以這樣做嗎?會彎曲和野牛接受它?

":="  //assignment operator 
"//"  //comment 
+1

您接受的答案不正確。我建議你不要聽從它的建議。 – rici

回答

0

您可以(與忽略大小寫選項)開始:

  • (read|write)\s+[a-z]+將匹配讀/寫表達;
  • [a-z]+\s:=[a-z+\/* -]*將匹配與簡單微積分;
  • \/\/.*將匹配內嵌評論;
  • \/\*[\s\S]*\*\/將匹配多行註釋。

請記住,這些是基本的正則表達式,可能不適合太複雜的語法。

您可以Regex101.com嘗試例如

+2

我很確定flex不理解'\ s'或'\ S'。也沒有理由逃脫斜線。你的最後一條規則是錯誤的,因爲它會從文件中的第一個'/ *'到最後一個'* /'。請參閱[文檔](http://flex.sourceforge.net/manual/How-can-I-match-C_002dstyle-comments_003f.html)以獲取正確的解決方案。但最重要的是,您的前兩個模式可以匹配多個令牌,包括應忽略的空間令牌。野牛無法對這些有用的東西做任何事情。 – sepp2k

2

是,「:=」和「//」會工作,雖然註釋規則確實應該"//".*,因爲你想跳過後//(直到一切行結束)。如果你只是匹配「//」,flex會嘗試標記它後面的內容,這是你不想要的,因爲評論不必包含有效標記(即使它的確如此,那些標記應該可以被看到解析器)。

進一步[Rr][Ee][Aa][Dd]應放在標識符規則之前。否則它永遠不會匹配(因爲如果兩個規則可以匹配相同的詞位,flex將選擇文件中第一個匹配的那個)。它也可以更簡潔地編寫爲(?i:read),或者您可以使用%option caseless全局啓用不區分大小寫,並只寫read

相關問題