gpt4 book ai didi

parsing - Xtext语法错误 "Decision can match input ... using multiple alternatives: 1, 3, 4, 5"

转载 作者:行者123 更新时间:2023-12-02 13:34:29 26 4
gpt4 key购买 nike

我被 xtext 语法定义困住了。基本上我喜欢为一个组件定义多个参数。该组件应至少包含一个参数定义 paramA OR paramB OR paramC OR (paramA AND paramB ) OR (paramB AND paramC) OR (paramA AND paramB AND paramC)。

总共有 6 种情况,正如您在我的语法定义中看到的:

Component:
'Define available parameters:' (
(newParamA = ParamA | newParamB = ParamB | newParamC = ParamC)
| (newParamA = ParamA & newParamB = ParamB)
| (newParamA = ParamA & newParamC = ParamC)
| (newParamB = ParamB & newParamC = ParamC)
| (newParamA = ParamA & newParamB = ParamB & newParamC = ParamC)
)
;

ParamA: ('paramA = ' paramA=Integer ';');
ParamB: ('paramB = ' paramB=Integer ';');
ParamC: ('paramC = ' paramC=Integer ';');

// Datatype
Integer returns ecore::EIntegerObject: '-'? INT;

当我减少语法以仅使用 (newParamA = ParamA | newParamB = ParamB | newParamC = ParamC) 时,这是有效的,意味着没有其他情况第一个代码片段:

Define available parameters:
paramA = 1;
...
Define available parameters:
paramB = 2;
...
Define available parameters:
paramC = 3;

但我希望能够在我的 dsl 中定义多个可用参数,例如

Define available parameters:
paramA = 1; paramB = 2;
...
Define available parameters:
paramB = 2; paramC = 3;
...
Define available parameters:
paramA = 1; paramB = 2; paramC = 3;

知道如何解决这个问题吗?希望您能帮助我,我将不胜感激!

这是我从代码片段 #1 生成语法时遇到的错误:

warning(200): ../my.packagename/src-gen/my/packagename/projectname/parser/antlr/internal/InternalMyDSL.g:722:1: Decision can match input such as "'paramC = ' '-' RULE_INT ';'" using multiple alternatives: 1, 3, 4, 5
As a result, alternative(s) 3,5,4 were disabled for that input
Semantic predicates were present but were hidden by actions.

...

4514 [main] ERROR enerator.CompositeGeneratorFragment - java.io.FileNotFoundException: ..\my.packagename.ui\src-gen\my\packagename\projectname\ui\contentassist\antlr\internal\InternalMyDSLParser.java (The system cannot find the file specified)
org.eclipse.emf.common.util.WrappedException: java.io.FileNotFoundException: ..\my.packagename.ui\src-gen\my\packagename\projectname\ui\contentassist\antlr\internal\InternalMyDSLParser.java (The system cannot find the file specified)
at org.eclipse.xtext.util.Files.readFileIntoString(Files.java:129)
at org.eclipse.xtext.generator.parser.antlr.AbstractAntlrGeneratorFragment.simplifyUnorderedGroupPredicates(AbstractAntlrGeneratorFragment.java:130)
at org.eclipse.xtext.generator.parser.antlr.AbstractAntlrGeneratorFragment.simplifyUnorderedGroupPredicatesIfRequired(AbstractAntlrGeneratorFragment.java:118)
at org.eclipse.xtext.generator.parser.antlr.XtextAntlrUiGeneratorFragment.generate(XtextAntlrUiGeneratorFragment.java:86)

这是我尝试过的解决方法(有效),但这不是解决方案,因为语言中的关键字正在更改以避免解析器错误:

('newParamA1 = ' paramA1=Integer ';')
| ('newParamB1 = ' paramB1=Integer ';')
| ('newParamC1 = ' paramC1=Integer ';')
| (('newParamA2 = ' paramA2=Integer ';') & ('newParamB2 = ' paramB2=Integer ';'))
| (('newParamA3 = ' paramA3=Integer ';') & ('newParamC2 = ' paramC2=Integer ';'))
| (('newParamB3 = ' paramB3=Integer ';') & ('newParamC3 = ' paramC3=Integer ';'))
| (('newParamA4 = ' paramA4=Integer ';') & ('newParamB4 = ' paramB4=Integer ';') & ('newParamC4 = ' paramC4=Integer ';'))

最佳答案

我认为您真正想要的是一种验证,以确保在语义级别而不是在语法级别上给出至少一个参数。这将大大简化你的语法,例如你可以使用

(newParamA = ParamA)? & (newParamB = ParamB)? & (newParamC = ParamC)?

(括号。为清楚起见添加)

另请注意,避免关键字中出现空格通常是个好主意。您应该更喜欢 'paramA' '=' 而不是 'paramA ='。这将极大地改善词法分析器/解析器中的错误处理。

关于parsing - Xtext语法错误 "Decision can match input ... using multiple alternatives: 1, 3, 4, 5",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20831419/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com