コンパイラー、パーサー、パーサージェネレーターの作成に興味がありますが、よくわかりません。
この質問の答えを読んだ後、私は「非常に」単純なLaTeXパーサーを作成しようとしました。
これはコードです:
grammar Latex;
latex : ITEM*;
ITEM : CMD|LAWTEXT;
CMD : CHEAD ARGS;
CHEAD : '\\' LETTER(LETTER|DIGIT)*;
LETTER : 'A'..'Z'|'a'..'z';
DIGIT : '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9';
ARGS : '{' ITEM* '}';
LAWTEXT : (LETTER|DIGIT|WHITESPACE|PUNC)*;
WHITESPACE
: ' '|'\t'|'\n'|'\r';
PUNC : '!'|'^';
(テスト目的で、PUNCには2文字しかありません)
そしてこれはエラーメッセージです:
[18:39:09] warning(200): C:\Users\***\Documents\Latex.g:9:12: Decision can match input such as "{'\t'..'\n', '\r', ' '..'!', '0'..'9', 'A'..'Z', '\\', '^', 'a'..'z', '}'}" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
[18:39:09] error(201): C:\Users\***\Documents\Latex.g:9:12: The following alternatives can never be matched: 2
[18:39:09] error(211): C:\Users\***\Documents\Latex.g:1:8: [fatal] rule Tokens has non-LL(*) decision due to recursive rule invocations reachable from alts 1,2. Resolve by left-factoring or using syntactic predicates or using backtrack=true option.
このエラーはあいまいさが原因で発生することがわかりました。コードは2つ以上の方法で解釈できますが、このあいまいさがどのように生成されるのかわかりません。
そして、これは図であり、何かを解釈できる2つの方法です(多分)。
...しかし、どのよう\
に、そして}
混乱する可能性がありますか?