1

Xtextアーティファクトを生成しようとすると、複数の代替エラーが発生し続ける単純な小さな文法があります。文法は次のとおりです。

grammar org.xtext.example.hyrule.HyRule with org.eclipse.xtext.xbase.Xbase

generate hyRule (You can only use links to eclipse.org sites while you have fewer than 25 messages )

Start:
    rules+=Rule+
    ;

Rule:
    'FOR''PAYLOAD'payload=PAYLOAD'ELEMENTS' elements+=JvmFormalParameter+'CONSTRAINED' 'BY' expressions+= XExpression*;

PAYLOAD:
    "Stacons"|"PFResults"|"any"
;

そして、私が得る正確なエラーは次のとおりです。

![warning(200): ../org.xtext.example.hyrule/src-gen/org/xtext/example/hyrule/parser/antlr/internal/InternalHyRule.g:3197:2: Decision can match input such as "{RULE_ID, '=>', '('}" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
error(201): ../org.xtext.example.hyrule/src-gen/org/xtext/example/hyrule/parser/antlr/internal/InternalHyRule.g:3197:2: The following alternatives can never be matched: 2][1]

antlrworks で生成された antlr 文法の構文図を添付し、複数の選択肢を明確に確認できます (JvmFormalParameter は、JvmTypeReference または ValidID ルールを介して RULE_ID と一致できます)。

JvmFormalParameter があいまいなように見えます...私の愚かさをお詫びしますが、誰かが私が見逃していることを指摘できますか? 私の文法で JvmFormalParameter ルールを使用するときに、このあいまいさを克服する方法はありますか?

ここに画像の説明を入力

4

1 に答える 1

2

ルール JvmFormalParameter は次のように定義されます。

JvmFormalParameter returns types::JvmFormalParameter:
    (parameterType=JvmTypeReference)? name=ValidID;

したがって、パラメーターのタイプはオプションです。を使用する場合elements+=JvmFormalParameter+、区切り文字なしで複数のパラメーターを許可するため、パーサーは入力シーケンスについて決定できません

String s

Stringとの両方sが 2 つのパラメーターの名前になるか、タイプと名前String sを持つ単一のパラメーターになる可能性があるためです。次のような区切り記号を使用する必要がありますStrings

elements+=JvmFormalParameter (',' elements+=JvmFormalParameter)*

FullJvmFormalParameterまたは、必須のタイプ参照で定義されたルールを使用します。

FullJvmFormalParameter returns types::JvmFormalParameter:
    parameterType=JvmTypeReference name=ValidID;
于 2012-08-30T18:21:38.923 に答える