可以设置规则/解析器/词法分析器以接受符合预期结构的输入,但静态(预定义)令牌不能完整写入吗?
我有一个ANTLR4语法(C#目标),我用它来解析一些输入并使用它来运行我的应用程序的特定方法。
(虚构的):
grammar:
setWage
: SETWAGE userId=STRING value=NUMBER
;
SETWAGE
: 'setWage'
;
input:
setWage john.doe 2000
在setWage规则的方法中遍历解析树的侦听器(在从标记的标记获取文本之后)将调用例如:
SalaryManager.SetWage(User.GetById("john.doe"), 2000);
我的问题:可以设置Antlr(或语法),以便例如允许这样的输入:
setW john.doe 2000
假设没有例如规则“setWater”或“setWindow”,或假设有并且我很好,Antlr自己选择其中一个(虽然,始终是相同的)。
请注意,这个问题主要是学术性的,我不是在寻找更好的方法来实现那种输入 - >动作链接。
答案 0 :(得分:0)
您可能已经知道这一点,但您可以详细说明可能的输入匹配
SETWAGE : 'setW' | 'setWa' | 'setWag' | 'setWage' ;
或
SETWAGE : 'set' ('W' ('a' ('g' ('e')? )? )? ) ;
不确定后者是否满足您的要求"静态(预定义)令牌未完全写入"。
硬编码"同义词"可能很乏味,但你需要多少?
这是我写的一个验证方法的例子。 (Java目标,但这不重要)
<强> actions.g4 强>
grammar actions ;
actions : action+;
action : setWage | deductSum ;
setWage : SETWAGEOP userId=SYMBOL value=NUMBER ;
deductSum : DEDUCTSUMOP userId=SYMBOL value=NUMBER ;
//SETWAGEOP : 'setW' | 'setWa' | 'setWag' | 'setWage' ;
SETWAGEOP : 'set' ('W' ('a' ('g' ('e')? )? )? ) ;
DEDUCTSUMOP : 'deduct' ('S' ('u' ('m')? )? ) ;
WS : [ \t\n\r]+ -> channel(HIDDEN) ;
SYMBOL : [a-zA-Z][a-zA-Z0-9\.]* ;
NUMBER : [0-9]+ ;
<强> testinput 强>
setW john.doe 2000
deductS john.doe 50
setWag joe.doe.III 2002
deductSu joe.doe 40
setWage jane.doe 2004
deductSum john.doe 50
<强>文稿:强>
$ antlr4 actions.g4 ; javac actions*.java ; grun actions actions -tree < testinput
(actions (action (setWage setW john.doe 2000)) (action (deductSum deductS john.doe 50)) (action (setWage setWag joe.doe.III 2002)) (action (deductSum deductSu joe.doe 40)) (action (setWage setWage jane.doe 2004)) (action (deductSum deductSum john.doe 50)))