3

これは、パーボイルド パーサー フレームワークと一般的な BNF/PEG の両方に固有の問題です。

かなり単純な正規表現があるとしましょう

^\\s*([A-Za-z_][A-Za-z_0-9]*)\\s*=\\s*(\\S+)\\s*$

の擬似EBNFを表します

<line>               ::= <ws>? <identifier> <ws>? '=' <nonwhitespace> <ws>?
<ws>                 ::= (' ' | '\t' | {other whitespace characters})+
<identifier>         ::= <identifier-head> <identifier-tail>
<identifier-head>    ::= <letter> | '_'    
<identifier-tail>    ::= (<letter> | <digit> | '_')*
<letter>             ::= ('A'..'Z') | ('a'..'z')
<digit>              ::= '0'..'9'
<nonwhitespace>      ::= ___________

EBNF で非空白 (空白ではない 1 つ以上の文字) をどのように定義しますか?

Java のパーボイルド ライブラリーに精通している人にとって、非空白を定義するルールをどのように実装できるでしょうか?

4

2 に答える 2

5

文字範囲と文字範囲に対する操作を指定するための語彙ジェネレーターの規則に固執しています。

多くのレクサー ジェネレーターは、文字を表すために 16 進値 (0x のようなもの) を受け入れるため、次のように記述できます。

 '0'..'9'
 0x30..\0x39

桁用。

非空白の場合、使用している文字セットを知る必要があります。7 ビット ASCII の場合、非空白は概念的にはすべての印刷文字です。

0x21..\0x7E

ISO8859-1 の場合:

( 0x21..\0x7E | 0x80-0xFF )

0x80 より上の文字コードがスペースであるかどうかは、自分で判断できます (非改行スペースはスペースですか?)。また、制御文字 0x0..0x1F のステータスを決定することもできます。タブ (0x9) は空白文字ですか? CR 0xD と LF 0xA はどうですか?ETB 制御文字はどうですか?

Unicode は巨大なセットであり、リストが大きくなり、面倒になるため、より困難です。 C'est la vie . 当社のDMS Software Reengineering Toolkitは、さまざまな言語用のパーサーを構築するために使用され、ASCII、多くの z 用の ISO8859-z、および Unicode 用のレクサーをサポートする必要があります。複雑な「加算」正規表現の範囲を記述するのではなく、DMS は減算正規表現を使用できるため、次のように記述できます。

 <UniCodeLegalCharacters>-<UniCodeWhiteSpace>

これははるかに理解しやすく、最初の試行で正しく理解できます。

于 2011-03-03T19:14:23.697 に答える