1

単語を含むトークンを説明する必要があります。単語には、英語の文字やその他の特殊記号を含めることができますが、定義済みの英語の文字 (「O」など) で始めることはできません。

AND_SYMBOL_IN 操作か何かが必要なようですが、javacc のドキュメントにはありません。次のような動作が必要です。

TOKEN : { < LETTERS: (
  (~["O", "-"] AND_SYMBOL_IN ["a"-"z","A"-"Z","-",".","&","|","0"-"9"])? (["a"-"z","A"-"Z","-",".","&","|","0"-"9"])+
  ) > }

特別なトークン (以下のようなもの) を作成することもできますが、もっと良い決定があると思いますよね?

TOKEN : { < #LETTEREX: (
["a"-"z","A"-"N","P"-"Z",".","&","|","0"-"9","-"]) > }

TOKEN : { < LETTERS: (
(< LETTEREX > ) (< LETTEREX > | ["O"])+
) > }
4

1 に答える 1

2

JavaCC は、一致するトークンが文法で宣言されている順序を使用して、同じサイズの一致間のあいまいさを解決します。したがって、1 つの可能性は、トークンの前に不要なトークンを一致させることです。

例えば:

TOKEN : { < #LETTER : ["a"-"z","A"-"Z","-",".","&","|","0"-"9"] > }
TOKEN : { < WORDS_STARTING_WITH_O : "O" ( < LETTER > )+ > }
TOKEN : { < WORDS_NOT_STARTING_WITH_O : (< LETTER > )+ > }

これがどれだけ適しているかは、特殊なケースの数とその複雑さによって異なります。

于 2012-03-19T17:06:39.840 に答える