あいまいな文法に問題があります。私はこれを持っています:
%token identifier
%token lolcakes
%start program
%%
program
: call_or_definitions;
expression
: identifier
| lolcakes;
expressions
: expression
| expressions ',' expression;
call_or_definition
: function_call
| function_definition;
call_or_definitions
: call_or_definition
| call_or_definitions call_or_definition;
function_argument_core
: identifier
| identifier '=' expression
| identifier '=' '{' expressions '}';
function_call
: expression '(' function_arguments ')' ';';
function_definition
: identifier '(' function_definition_arguments ')' '{' '}';
function_argument
: lolcakes
| function_argument_core;
function_arguments
: function_argument
| function_arguments ',' function_argument
function_definition_argument
: expression function_argument_core
| function_argument_core;
function_definition_arguments
: function_definition_argument
| function_definition_arguments ',' function_definition_argument;
これは私の本物の文法のサブセットであり、個別にコンパイルできます。現時点では、ストリームとの間function_call
にS/Rの競合が発生します。関数呼び出しと関数定義の文法を統一することで、トークンストリームの後半まで決定を下す必要がないことをBisonに納得させようとしています。言い換えると、呼び出しと定義の両方に共通する何かに遭遇した場合、どちらがどちらであるかを知る必要なしにそれを減らすことができ、他の何かに遭遇した場合、他の何かがどちらを明確にラベル付けします。それも可能ですか?もしそうなら、どうすればそれができますか?可能であれば、入力ストリームの構造を変更する必要はありません。function_definition
identifier (