再帰下降パーサーで使用される文法を表すtxtファイルを解析しようとしています。 txtファイルは次のようになります。
SPRIME :: = Expr eof
Expr :: = Term Expr '
Expr ':: = + Term Expr' | --Term Expr '| e
左側を分離し、右側を個別のプロダクションルールに分割するために、各行を取得して次のように呼び出します。
String[] firstSplit = line.split("::=");
String LHS = firstSplit[0];
String productionRules = firstSplit[1].split("|");
ただし、2番目のsplitメソッドを呼び出すと、「|」で区切られた文字列の配列が返されません。文字ですが、右側にある「|」を含む個々の文字の配列です。したがって、たとえば、Exprのルールを解析してproductionRules配列を出力した場合、次のようになります。
「+」
"期間"
"Expr '"
""
"|"
私が本当に欲しいものがこのように見えるべきとき:
誰かが私が間違っていることについて何か考えがありますか?
split
は引数として正規表現を使用するため、意図しないすべての正規表現シンボルをエスケープする必要があります。
String.split()
のパラメーターは正規表現であり、縦棒文字は特殊です。
バックスラッシュでエスケープしてみてください。
String productionRules = firstSplit[1].split("\\|");
注意:バックスラッシュ文字自体は文字列リテラル内で特別であるため、2つのバックスラッシュが必要です。
パイプをエスケープする必要があります(|
)regex
OR
演算子である記号。
String productionRules = firstSplit[1].split("\\|");
または
String productionRules = firstSplit[1].split(Pattern.quote("|"));
パイプ文字は、「または」の正規表現演算子です。あなたが欲しいのは
String productionRules = firstSplit[1].split("\\|");
これは、実際のパイプ文字を探すように指示します。