3
[11:45:19] warning(200): mygrammar.g:14:57: Decision can match input such as "','" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
[11:45:19] warning(200): C:\Users\Jarrod Roberson\mygrammar.g:14:57: Decision can match input such as "','" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input

関数を他の関数の中にネストできるようにしたい。

myfunction(x) ->
  sqr(a) -> a * a,
  y -> sqr(x).

これが不平を言っている行です

function : ID '(' args ')' '->' statement (',' statement)* ;

これが代替案を検討しているものです

statement : ATOM
          | expression
          | assignment
          | function
          ;

.ステートメントの終了ルールとして使用しています

program : (statement'.')*;

ANTLRWorksでのsynatx図は次のようになります

シンタックスダイアグラム
(出典:vertigrated.com

私は警告なしにコンパイル/動作するものが本当に好きです。この警告状態を解決するにはどうすればよいですか?

4

1 に答える 1

2

JarrodRobersonは次のように書いています。

私は警告なしにコンパイル/動作するものが本当に好きです。この警告状態を解決するにはどうすればよいですか?

パーサーは次の入力を解析できます。

f(x)-> g(y)-> y*y, x=y

2つの異なる解析ツリーで:

ここに画像の説明を入力してください

と:

ここに画像の説明を入力してください

これを修正するには、パーサーに先読みを強制し、',' statement実際にこれらのルールに一致する前に先を見越していることを確認します。(...)=>これを行うには、次のルールを内部に持つ構文述語(部分)を使用します。

function
  :  ID '(' args ')' '->' statement ((',' statement)=> ',' statement)* 
  ;

functionただし、ルールに定義していない「終了」トークンがある場合は、述語は必要ありません。以前の質問と例から:

myfunction(x) ->
  sqr(a) -> a * a,
  y = sqr(x).

'.'の終わりとしてを使用しているようですfunctionfunctionそれをルールに追加する場合:

function
  :  ID '(' args ')' '->' statement (',' statement)* '.'
  ;

述語はまったく必要ありません。

于 2011-11-14T19:08:56.450 に答える