2.2.1
1)S-> S S *-> S S + S *->a S + S *->a a + S *->a a + a *
2)
3)L={由多个a,加号,乘号组成的后缀表达式}
2.2.2
1)L={0^n 1^n | n>=1}
2)L={由多个a,加号,减号组成的前缀表达式}
3)L={ε或任意排列,嵌套的括号}
4)L={ε或包含相同数量a,b的字符串}
5)L={符合我们从左到右计算优先级认知的运算串,由a与符号+, * ()组成,优先级由高到低为(), *,+}
2.2.3
1)没有
2)没有
3)有的
4)有的
5)有的
2.2.4
1.num = {数字},opn = {运算符号}
S -> S S opn | num
每个表达式推导路径唯一。
2.c = {标识符}, S -> S , c | c
表达式的语法分析树只向左拓展,所以推导路径唯一。
3.c = {标识符}, S -> c , S | c
同理2,只向右。
4.S → S + T | S - T | T
T → T * F | T / F | F
F → 标识符 | 整数 | ( S )
5.S → S + T | S - T | T
T → T * F | T / F | F
F → + U | - U | U
U → 标识符 | 整数| ( S )
2.2.5
1)证明:当num = 11或者1001时,当然能被3整除,那么对于num 0 或者num num ;
首先 num 0 ,左移一位,令 num= 3k, 那么 num 0=3k2,被3整除。
那么 num num ,一样的,令 num = 3a, num 3b,那么 num num = 3a2^n +3b*2^m,被3整除。
2)不行吧,10101生成不出来
2.2.6
romanNum -> thousand hundred ten digit
thousand -> M | MM | MMM | ε
hundred -> smallHundred | C D | D smallHundred | C M
smallHundred -> C | CC | CCC | ε
ten -> smallTen | X L | L smallTen | X C
smallTen -> X | XX | XXX | ε
digit -> smallDigit | I V | V smallDigit | I X
smallDigit -> I | II | III | ε
AI
这个文法描述了罗马数字的构成规则,其中:
romanNum 是开始符号,表示一个完整的罗马数字。
thousand 表示千位的罗马数字,可以是 M、MM、MMM 或空(ε)。
hundred 表示百位的罗马数字,可以是 smallHundred、C D、D smallHundred 或 C M。
smallHundred 表示小于百位的罗马数字,可以是 C、CC、CCC 或空(ε)。
ten 表示十位的罗马数字,可以是 smallTen、X L、L smallTen 或 X C。
smallTen 表示小于十位的罗马数字,可以是 X、XX、XXX 或空(ε)。
digit 表示个位的罗马数字,可以是 smallDigit、I V、V smallDigit 或 I X。
smallDigit 表示小于个位的罗马数字,可以是 I、II、III 或空(ε)。
这个文法能够生成所有有效的罗马数字,并且符合罗马数字的构成规则。