Scheme ANTLR解决非LL(*)问题和语法谓词

Scheme ANTLR解决非LL(*)问题和语法谓词,scheme,antlr,r5rs,predicates,Scheme,Antlr,R5rs,Predicates,在解析器中考虑以下规则: expression : IDENTIFIER | (...) | procedure_call // e.g. (foo 1 2 3) | macro_use // e.g. (xyz (some datum)) ; procedure_call : '(' expression expression* ')' ; macro_use : '(' IDENTIFIER d

在解析器中考虑以下规则:

expression 
    :   IDENTIFIER
    |   (...)
    |   procedure_call // e.g. (foo 1 2 3)
    |   macro_use   // e.g. (xyz (some datum))
    ;

procedure_call
    :   '(' expression expression* ')'
    ;

macro_use
    :   '(' IDENTIFIER datum* ')'
    ;


expression 
    :   IDENTIFIER
    |   (...)
    |   ('(' IDENTIFIER expression)=>procedure_call // e.g. (foo 1 2 3)
    |   macro_use   // e.g. (xyz (some datum))
    ;
也不起作用,因为只有第一条规则才能匹配任何东西。有没有合适的方法来解决这个问题?

我找到了一个用于(快速!)编写ANTLR等价物的方法:

/*
*Bart Kiers版权所有(C)2011,基于Håkan L.Younes的著作
*JavaCC R5RS语法,可从以下网址获得:http://mindprod.com/javacc/R5RS.jj
* 
*特此向任何获得副本的人免费授予许可
*本软件和相关文档文件(“软件”)的
*在软件中不受限制,包括但不限于权利
*使用、复制、修改、合并、发布、分发、再许可和/或销售
*软件的副本,并允许向其提供软件的人员
*按照以下条件提供:
* 
*上述版权声明和本许可声明应包含在
*软件的所有副本或主要部分。
* 
*本软件按“原样”提供,无任何形式的明示或明示担保
*默示,包括但不限于适销性保证,
*适用于特定目的和非侵权。在任何情况下
*作者或版权持有人应承担任何索赔、损害或其他责任
*无论是在合同诉讼、侵权诉讼或其他诉讼中,由以下原因引起的责任:,
*与本软件有关或与本软件的使用或其他交易有关
*软件。
*/
语法R5R;
作语法分析
:命令定义*EOF
;
命令定义
:(syntaxDefinition)=>syntaxDefinition
|(定义)=>定义
|(“(“BEGIN commandOrDefinition)=>”(“BEGIN commandOrDefinition+”)”
|命令
;
句法定义
:“('DEFINE_SYNTAX关键字transformerSpec')”
;
定义
:“(“定义(变量表达式”)”
|“(“变量形式”)“主体”)”
)
|“(“开始定义*”)”
;
变形
:变量*('.'变量)?
;
关键词
:标识符
;
变压器规格
:“(“语法规则”(“标识符*)“语法规则*”)”
;
合成规则
:“(“模式模板”)”
;
图案
:模式标识符
|“(”(模式+(“.”模式|省略号)?)?”
|“#”((模式+省略号?)”
|模式基准
;
模式标识符
:syntacticKeyword
|变数
;
模式基准
:字符串
|性格
|布尔
|数
;
模板
:模式标识符
|“(”(templateElement+(“.”templateElement)?)?”
|“#”(“templateElement*”)
|模板数据
;
模板元素
:模板省略号?
;
模板数据
:图案基准
;
命令
:表达
;
标识符
:syntacticKeyword
|变数
;
句法词
:expressionKeyword
|否则
|箭
|定义
|取消报价
|取消拼接
;  
表达式关键字
:引用
|兰姆达
|如果
|设置
|开始
|康德
|及
|或
|案例
|让
|莱斯塔
|莱特雷克
|做
|耽搁
|准晶石
;  
表达
:(变量)=>变量
|(文字)=>文字
|(lambdaExpression)=>lambdaExpression
|(有条件)=>有条件
|(分配)=>分配
|(derivedExpression)=>derivedExpression
|(procedureCall)=>procedureCall
|(宏用法)=>宏用法
|宏块
;
变量
:变量
|省略号
;
字面意义的
:报价
|自我评价
;
引用
:“\”基准面
|“(“引用数据”)”
;
自我评价
:bool
|数
|性格
|串
;
lambdaExpression
:“(“LAMBDA形式体”)”
;
形式
:“(”(变量+(“.”变量)?)?”)
|变数
;
有条件的
:“(“如果测试结果为备选方案?”)”
;
试验
:表达
;
随之而来的
:表达
;
候补
:表达
;
分配
:“('SET variable expression')”
;
嘲弄的表情
:准旋转
|“(”(COND(“('ELSE sequence')”
|condClause+('('ELSE sequence'))?
)
|大小写表达式(“(“ELSE序列”)”
|caseClause+('('ELSE sequence'))?
)
|和测试*
|或测试*
|LET变量“(“bindingSpec*”)”正文
|LETSTAR“(“bindingSpec*”)”正文
|LETREC'('bindingSpec*')正文
|开始序列
|执行“(“iterationSpec*”)”(“test doResult?”)”命令*
|延迟表达式
) 
')'
;
条件从句
:“(“测试(序列|箭头接收者)?”
;
收件人
:表达
;
案例条款
:'(''(''基准*')序列''
;
绑定规范
:“(“变量表达式”)”
;
迭代规范
:“(“变量初始化步骤?”)”
;
初始化
:表达
;
步
:表达
;
多雷索
:顺序
;
程序召回
:“(“运算符操作数*”)”
;
操作人员
:表达
;
操作数
:表达
;
宏用途
:“(“关键字数据*”)”
;
宏块
:“('(LET_SYNTAX | LETREC_SYNTAX)'('syntaxSpec*')‘body')”
;
语法规范
:“(“关键字transformerSpec”)”
;
身体
:((定义)=>定义)*序列
;
//序列
//:((命令)=>命令)*表达式
//  ;
序列
:表达+
;
资料
:simpleDatum
|复合数据
;
单叶植物
:bool
|数
|性格
|串
|标识符
;
复合数据
:列表
|载体
;
列表
:“(”(基准面+(“.”基准面)?)?”
|缩写词
;
缩写
:abbrev前缀数据
;
缩写前缀
:  '\'' | '`' | ',@' | ','
;
矢量
:“#”(“基准*)”
;
数
:NUM_2
|数字8
|数字10
|数字16
;
布尔
:对
|假的
;
准液化
:准旋转[1]
;
准旋转[int d]
:“`qqTemplate[d]
|"("准量子模板")"
;
expression 
    :   IDENTIFIER 
    |   (...)
    |   (procedure_call)=>procedure_call // e.g. (foo 1 2 3)
    |   macro_use   // e.g. (xyz (some datum))
    ; 
expression 
    :   IDENTIFIER
    |   (...)
    |   ('(' IDENTIFIER expression)=>procedure_call // e.g. (foo 1 2 3)
    |   macro_use   // e.g. (xyz (some datum))
    ;
bart@hades:~/Programming/ANTLR/Demos/R5RS$ java -cp antlr-3.3.jar org.antlr.Tool R5RS.g bart@hades:~/Programming/ANTLR/Demos/R5RS$ javac -cp antlr-3.3.jar *.java bart@hades:~/Programming/ANTLR/Demos/R5RS$ java -cp .:antlr-3.3.jar Main bart@hades:~/Programming/ANTLR/Demos/R5RS$