1樓:
乙個例子,之前作業實現的乙個 C family toy language 的 EBNF,長這樣。
除了 boolean 外大致是 C 的子集。
這個版本沒處理 left-recursion,因為是作業的一部分。
program -> ( func-decl | var-decl )*
// declarations
func-decl -> type identifier para-list compound-stmt
var-decl -> type init-declarator-list ";"
init-declarator-list-> init-declarator ( "," init-declarator )*
init-declarator -> declarator ( "=" initialiser )?
declarator -> identifier
| identifier "[" INTLITERAL? "]"
initialiser -> expr
| ""
// primitive types
type -> void | boolean | int | float
// identifiers
identifier -> ID
// statements
compound-stmt -> ""
stmt -> compound-stmt
| if-stmt
| for-stmt
| while-stmt
| break-stmt
| continue-stmt
| return-stmt
| expr-stmt
if-stmt -> if "(" expr ")" stmt ( else stmt )?
for-stmt -> for "(" expr? ";" expr? ";" expr? ")" stmt
while-stmt -> while "(" expr ")" stmt
break-stmt -> break ";"
continue-stmt -> continue ";"
return-stmt -> return expr? ";"
expr-stmt -> expr? ";"
// expressions
expr -> assignment-expr
assignment-expr -> ( cond-or-expr "=" )* cond-or-expr
cond-or-expr -> cond-and-expr
| cond-or-expr "||" cond-and-expr
cond-and-expr -> equality-expr
| cond-and-expr "&&" equality-expr
equality-expr -> rel-expr
| equality-expr "==" rel-expr
| equality-expr "!=" rel-expr
rel-expr -> additive-expr
| rel-expr "<" additive-expr
| rel-expr "<=" additive-expr
| rel-expr ">" additive-expr
| rel-expr ">=" additive-expr
additive-expr -> multiplicative-expr
| additive-expr "+" multiplicative-expr
| additive-expr "-" multiplicative-expr
multiplicative-expr -> unary-expr
| multiplicative-expr "*" unary-expr
| multiplicative-expr "/" unary-expr
unary-expr -> "+" unary-expr
| "-" unary-expr
| "!" unary-expr
| primary-expr
primary-expr -> identifier arg-list?
| identifier "[" expr "]"
| "(" expr ")"
| INTLITERAL
| FLOATLITERAL
| BOOLLITERAL
| STRINGLITERAL
// parameters
para-list -> "(" proper-para-list? ")"
proper-para-list -> para-decl ( "," para-decl )*
para-decl -> type declarator
arg-list -> "(" proper-arg-list? ")"
proper-arg-list -> arg ( "," arg )*
arg -> expr
2樓:Belleve
語法定義一般是用(擴充套件過的)BNF。當然 python、haskell 這種的話就會有更多的描述,把縮排之類非 CF 的部分給「CF 化」。
語義定義多是 SDD 加上不太嚴格的指稱語義,畢竟嚴格的語義寫起來太蛋疼了……比如這是讀取變數的 CEK 式語義:
READ-VARIABLE v, e, s, k, t -> Just s(e(b)), e, s, k, t
三國演義裡哪些小人物改變了歷史軌跡?
張居正 推薦桃園三結義開篇那個買肉的。要不是他硬要來買肉,買不到肉還大聲嚷嚷,就不會引得乙個賣綠豆的前來出頭,那賣綠豆的也不會力舉磨盤引得乙個賣草蓆的關注,也不會引來張屠戶打架,不會不打不相識,不會有桃園三結義,接下來大家都知道了 所以不要隨便買肉,現在豬肉那麼貴 深哥頭馬 洛陽城看門口的乙個偷懶的...
三國裡面最牛逼的人是誰
燈塔 孫權,當之無愧。把平衡運用的爐火純青。劉備打曹操,孫權打劉備。諸葛亮打曹丕,孫權打諸葛亮。三角形,是最穩定的。孫權,比數學家都明白這個道理。絕對,不能缺少任何乙個。最愚蠢的是 張士誠。朱元璋打陳友諒,張士誠連動都不動。等朱元璋把陳友諒收拾了,回頭就把張士誠也收拾了。 馮虛御風 私以為還是曹老闆...
三國哪個人物的名字和身份最違和?
宣漢 我覺得是邢道榮,他這名字一出現在我眼前,便被他震懾。第一感覺,這是個大將,檀道濟那樣的,劉備要得個猛人了。第二感覺,這是個有術法的異人,鄭倫 包道乙 喬道清那樣的。然後我滿懷期待地往下瞄。結果很多人都知道了。 曹操 眭固原本是蒙特內哥羅賊,後來成為了呂布唯一的鐵哥們,張楊的部下。當初呂布遭到曹...