2016-02-13 207 views
2

我寫法對其中操作在前綴符號進行了特定的語言:在lex中,如何區分' - '(減法)運算符和整數'-3'?

(+ a b) --> (a + b)

整數定義如下:整數可以有一個負號( - ),但沒有正面標誌。它可以在符號和數字之間有或沒有空格。如果該值爲0,則只允許一個數字0。否則,它與常用整數定義相同(不包含前導0)。在lex表達

順序如下(第一場比賽規則):

  • 正則表達式的整數:[\-]?[ ]*((0)|([1-9][0-9]*))
  • 正則表達式減法運算符:"-"

有了這些定義,我想要解析字符串- 5 3即。 (5-3)

電流輸出

Integer : - 5, 

Integer : 3 

希望的輸出:

Operator : '-' 

Integer : 5 

Integer : 3 
+0

您的語言是否允許'-'作爲一元運算符?你的語言Lisp就像表達式必須加上括號,或者你可以寫'+ 1 2 3'嗎? – rici

+0

在該語言中,'-'不是一個一元運算符。這是一種現在簡單的語言,所以我不認爲我會遇到像表達式那樣的「+ 1 2 3」。 – ronakshah725

+0

如果在運算符周圍需要括號並禁止在整數範圍內使用括號,則可以區分一元減號和作爲整數部分的減號,因爲「( - 5)」無效。在這種情況下,'('後面的'-'總是一個運算符,''後面的運算符或值必須是整數的一部分,如果這些假設不正確,那麼它將是一個有點棘手 – rici

回答

3

你不知道。您將-和INTEGER分別返回給解析器,並讓解析器處理一元減號。

0

詞法分析器不必這樣做:通常解析器(諸如使用YACC寫)獲得令牌分別爲減號和整數。解析器根據您提供的規則組合這兩者。

對於簡單的語法,可以使用詞法分析器狀態(也稱爲開始條件)進行解析。在你的例子中,會有左/右括號嵌套的狀態。如果你的語法允許在一個減號和一個整數之間換行,你需要一個狀態來表明你有一個減號。

只是爲了識別任意符號的整數都在同一行,你能做到這與像

[-]?[[:space:]]*[[:digit:]]+ 

表達然而,你所需的輸出不組合標誌和整數。所以,你將有獨立的正則表達式的,例如,

[-]   { printf ("Operator: %s\n", yytext); } 
0|([1-9][0-9]*) { printf ("Integer: %s\n", yytext); } 
+0

我認爲這是解析器的工作,以區分適當使用「 - 」符號。但是,只是好奇。此外,感謝正則表達式。但是它並不包含領先0的條件@Thomas Dickey – ronakshah725