[英]Grammar of calculator in a finite field
除了一件事之外,我還有一個工作的計算器:一元運算符“-”。
必須在兩種不同的情況下對它進行評估和處理:
對於情況1,我想得到一個后綴輸出3 3 +-對於情況2,我想在這個字段中得到這個令牌的正確值,所以例如在Z10中它是10-3 = 7。
我目前的想法:
E: ...
| '-' NUM %prec NEGATIVE { $$ = correct(-yylval); appendNumber($$); }
| '-' E %prec NEGATIVE { $$ = correct(P-$2); strcat(rpn, "-"); }
| NUM { appendNumber(yylval); $$ = correct(yylval); }
在NUM是令牌的情況下,但顯然編譯器說有沖突,reduce / reduce是因為在某些情況下E也可以是NUM,盡管它可以正常工作,但我想擺脫編譯器警告。
必須在兩種不同的情況下對它進行評估和處理:
不,不是。 情況並不明顯。
- E
和- NUM
均不正確。 正確的語法如下:
primary
: NUM
| '-' primary
| '+' primary /* for completeness */
| '(' expression ')'
;
通常,這應該實現為兩個規則(偽代碼,我不知道野牛語法):
這是表達式的“終端”元素的可能規則。 自然地,用括號括起來的表達式會導致遞歸到最高規則:
Element => Number
| '(' Expression ')'
一元減號(以及一元加號!)在生產堆棧(語法規則)中僅處於較高級別:
Term => '-' Element
| '+' Element
| Element
自然地,它可以分解成所有可能的組合,例如'-' Number
, '-' '(' Expression ')'
,同樣帶有'+'
並且完全沒有任何一元運算符。
假設我們要加/減和乘/除。 然后,其余語法將如下所示:
Expression => Expression '+' MultiplicationExpr
| Expression '-' MultiplicationExpr
| MultiplicationExpr
MultiplicationExpr => MultiplicationExpr '*' Term
| MultiplicationExpr '/' Term
| Term
為了完整性:
碼頭:
Number
非終端:
Expression
Element
Term
MultiplicationExpr
Number
是一個終端,應匹配這樣的正則表達式[0-9]+
。 換句話說,它不解析減號-始終為正整數(或零)。 負整數是通過匹配令牌的'-' Number
序列來計算的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.