Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing LL(1)语法。如果有自递归规则,如何计算跟随集?_Parsing_Grammar_Context Free Grammar_Compiler Construction - Fatal编程技术网

Parsing LL(1)语法。如果有自递归规则,如何计算跟随集?

Parsing LL(1)语法。如果有自递归规则,如何计算跟随集?,parsing,grammar,context-free-grammar,compiler-construction,Parsing,Grammar,Context Free Grammar,Compiler Construction,根据本手册的规定: 如果A是起始非终结符,则将EOF放在后面(A) 查找右侧有A的产品: 对于每个产品X→ αAβ,放在第一位(β)− (A)中的{EPSILON} 如果ε在第一位(β),则将FOLLOW(X)放入FOLLOW(A) 对于每个产品X→ αA,将FOLLOW(X)放入FOLLOW(A)中 我的语法还有下一段: ... A -> C B B -> , A C -> EPSILON C -> = B -> ; .

根据本手册的规定:

  • 如果A是起始非终结符,则将EOF放在后面(A)
    查找右侧有A的产品:
  • 对于每个产品X→ αAβ,放在第一位(β)− (A)中的{EPSILON}
  • 如果ε在第一位(β),则将FOLLOW(X)放入FOLLOW(A)
  • 对于每个产品X→ αA,将FOLLOW(X)放入FOLLOW(A)中
  • 我的语法还有下一段:

     ...
        A -> C B
        B -> , A
        C -> EPSILON
        C -> =
        B -> ;
     ...
    
    当我试图根据规则4计算FOLLOW(B)时,我必须计算FOLLOW(A),反之亦然。由于自递归,我有StackOverflowException


    我该怎么办?

    您不使用递归。迭代,根据上一次迭代计算的内容计算
    FOLLOW
    集:

  • 如果A是起始非终端,则将EOF(指示输入结束的新终端)放入F[0](A)

  • 对于每个产品X→ αAβ,放在第一位(β)− F[n](A)中的{EPSILON}

  • 如果ε在第一个(β),那么把F[n-1](X)放入F[n](A)

  • 对于每个产品X→ αA,将F[n-1](X)放入F[n](A)

  • 当F[n](*)==F[n-1](*)时停止

  • 跟随(*)=F[n](*)

    也许最好继续问?