2012-01-17 8 views
0

状況は非常に単純な構文を書いていますが、コンパイルすると競合が発生します。 このようなシンプルな構文が矛盾してしまうのではないかと思います。yaccにはシフト/リダクションの競合があります

%token SCRIPT_ID 
%token STRING 
%start functions 

%% 
functions: SCRIPT_ID '(' STRING ')' {printf("script_id is %s", $3);}; 
%% 

ファイルを解析するためにyaccを使用したいだけです。私のファイルにはscript_id( "1232444")のようなものがあります。

私はyaccマニュアルを検索し、shift/reduce競合について説明すると、 'if and else'のような例が挙げられます。そして、私が理解している理由は、prioperityが指定されていない場合、 'ifとelse'に矛盾があります。 しかし、if-else-conflictには、私が会った葛藤とは何か関係があるのか​​分かりません。

私のコードに何が間違っているか教えていただけますか?

+0

SCRIPT_IDとSTRINGのトークンをどのように定義できますか? – Zuljin

+1

yaccの詳細な出力に詳細な情報が表示されることがあります。文法を '-v'オプションでコンパイルしてください。これにより、情報が入ったファイル 'y.output'(またはそのようなもの)が生成されます。 –

答えて

1

あなたはどんな正確なエラーが発生したかは明記していません。 1つのルールだけで文法のシフト/リダクションの競合を得ることができないため、文法全体を表示していないこともほぼ確実です。

しかし、一般に、シフト/リダクションの競合が何であるかを理解するには、実際に望むよりもLRパースステートマシンの理論について多くのことを学ぶ必要があります。

この全体的なトピックで最高の全体的なテキストおよびリファレンス本は、いわゆる「ドラゴンです:仮定すると、あなたは、しかし、あなたはこれらのウィキペディアのページで始めるかもしれませんしたいです(本名:コンパイラ:原則、テクニック、ツール):http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools

関連する問題