You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LL(1)语法转换报错求助:在线Parser Generator生成失败

LL(1)语法解析报错排查与修复方案

问题1:产生式语法书写错误

RETURNST的定义多了一个冗余分号,原代码:

RETURNST ;:= return RETURNEXPR

修复为:

RETURNST ::= return RETURNEXPR

问题2:间接左递归(FLIST')

原FLIST'产生式调用FLIST,而FLIST又依赖FLIST',形成循环依赖的间接左递归,违反LL(1)语法规则:

FLIST ::= FDEF FLIST'
FLIST' ::= FLIST | ""

修复为右递归形式:

FLIST ::= FDEF FLIST'
FLIST' ::= FDEF FLIST' | ""

问题3:间接左递归(VARLIST')

原VARLIST'调用VARLIST,VARLIST又依赖VARLIST',存在循环依赖:

VARLIST ::= id VARLIST'
VARLIST' ::= , VARLIST | ""

修复为:

VARLIST ::= id VARLIST'
VARLIST' ::= , id VARLIST' | ""

问题4:间接左递归(PARLISTCALL')

原PARLISTCALL'调用PARLISTCALL,PARLISTCALL又依赖PARLISTCALL',存在循环依赖:

PARLISTCALL ::= id PARLISTCALL'
PARLISTCALL' ::= , PARLISTCALL | ""

修复为:

PARLISTCALL ::= id PARLISTCALL'
PARLISTCALL' ::= , id PARLISTCALL' | ""

问题5:语法符号格式问题

FACTOR产生式中括号与非终结符之间的多余空格可能导致工具识别异常,原代码:

FACTOR ::= ( NUMEXPR) 

修复为:

FACTOR ::= (NUMEXPR)

修复后的完整LL(1)语法

MAIN ::= STMT
MAIN ::= FLIST 
MAIN ::= ""

FLIST ::= FDEF FLIST'
FLIST' ::= FDEF FLIST' | ""

FDEF ::= def id ( PARLIST ) { STMTLIST }

PARLIST ::= int id PARLIST'
PARLIST' ::= , int id PARLIST' | ""

VARLIST ::= id VARLIST'
VARLIST' ::= , id VARLIST' | ""

STMT ::= int VARLIST ;
STMT ::= ATRIBST ;
STMT ::= PRINTST ;
STMT ::= RETURNST ;
STMT ::= IFSTMT ;
STMT ::= { STMTLIST } ;
STMT ::= ; 

ATRIBST ::= id := ATREXPR
ATREXPR ::= EXPR | FCALL

FCALL ::= id ( PARLISTCALL )

PARLISTCALL ::= id PARLISTCALL'
PARLISTCALL' ::= , id PARLISTCALL' | ""

PRINTST ::= print EXPR

RETURNST ::= return RETURNEXPR
RETURNEXPR ::= id | ""

IFSTMT ::= if ( EXPR ) STMT IFSTMT'
IFSTMT' ::= else STMT | ""

STMTLIST ::= STMT STMTLIST'
STMTLIST' ::= STMT STMTLIST' | ""

EXPR ::= NUMEXPR EXPR'
EXPR' ::= < NUMEXPR | <= NUMEXPR | > NUMEXPR | >= NUMEXPR | == NUMEXPR | <> NUMEXPR | ""

NUMEXPR ::= TERM NUMEXPR'
NUMEXPR' ::= + TERM NUMEXPR' | - TERM NUMEXPR' | ""

TERM ::= FACTOR TERM'
TERM' ::= * FACTOR TERM' | / FACTOR TERM' | ""

FACTOR ::= num | (NUMEXPR) | id

验证说明

将修复后的语法输入LL(1)解析器生成工具即可消除解析表冲突,核心修复点是消除所有左递归和修正语法书写错误,这是LL(1)语法的硬性要求。

内容的提问来源于stack exchange,提问作者Lucas Broering

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:49:59