LR automaton nature

Q: LR自动机的本质是什么?
A: 栈 + rules

Q: LR自动机栈的本质是什么?
A: 细化reduce任务, 等待返回结果

Q: ‘A -> . B’ 能分化出多少条non-kernel item?
A:

1
2
3
4
function getItemNumByNonTerminal(nonTerminal):  
let firstGenRules = filter rules in which left side is the nonTerminal
let nonterminals = the non-duplicated head non-terminal of firstGenRules
return length of firstGenRules + nonterminals.map(getItemNum)

Q: 一共会有多少个state?
A: 也就是,一共会有多少个itemset? 总所周知symbol集里的每一个symbol产生一个itemset, 对itemset里面的rule移动dot之后产生新的symbol集, 所以很难量化

Q: 步骤简述:
A: move -> extend -> get symbols -> split itemset by symbols

Q: Reduce是盲目的,这样会出现什么问题?什么样的文法会违反这个规则?

Q: 什么样的文法是non-LR grammar?
A: 1. reduce-shift conflict grammar, 比如dangling else. 2. reduce-reduce conflict, 定义重复, 同样的规则不同的nonterminal

Q: 为Box construct一个LR table

Box : open close Box
Box : e


split ^ {Box := open close Box}
move {Box := . open close Box}
extend itemset0 {Box := . open close Box}
xs { open }


split open {Box := . open close Box}
move {Box := open . close Box}
extend itemset1 {Box := open . close Box}
xs {close}


split close {Box := open . close Box}
move {Box := open close . Box}
// extend itemset2 {Box := open close . Box, Box := . open close Box, Box := . $}
// Q: 我是不是可以不要epsilon? =>
// extend itemset2 {Box := open close . Box, Box := . open close Box}
// A: 没有epsilon永远到不了state3
extend itemset2 {Box := open close . Box, Box := . open close Box, Box := . e}
xs {Box, open, e}


split Box {Box := open close . Box}
move {Box := open close Box .}
extend itemset3 {Box := open close Box .}
all cols reduce

split open {Box := . open close Box}
move {Box := open . close Box}
extend {Box := open . close Box} the same as itemset1
goto itemset1

split e {Box := . e}
move {Box := e .}
extend itemset4 {Box := e .}
reduce all cols


split $ {Box := open close Box .}

Q: 在move之后,会不会发生,itemset隶属于某个itemset的情况?
A: itemset是由根节点扩展来的?假如同时出现了set1, set2, set2属于set1? 因为set2不能为set1的kernel item, 不然完全可以分化成set1跟set1等价,所以只能为分化的item, 因为分化item都是从^开始的,所以set2的item必然是从^开始的, 因为从^开始,所以它必须由某个东西分化而来。不好意思,他们就是等价的