2017-02-09 13 views
1

:それぞれのトークナイザからパーサーを構築するにはどうすればよいですか?私のような文字列を解析する<a href="/questions/tagged/jparsec" class="post-tag" title="show questions tagged 'jparsec'" rel="tag">jparsec</a>を使用しています

final class OpenListToken 
final class CommaToken 
final class CloseListToken 
final class NumberToken // Has a public final property "value" that contains the int 

私も実装したトークナイザ:

[1,2, 3] 
[ 3, 4] 
[3 ,4,56, 7 ] 
[] 

私が実装したいくつかのクラスは、トークンを表すために(私のTokenインタフェースから継承します) :

static final Parser<OpenListToken> openListTokenParser 
static final Parser<CommaToken> commaTokenParser 
static final Parser<CloseListToken> closeListTokenParser 
static final Parser<NumberToken> numberTokenParser 

これらはすべて文字レベルで動作します。たとえば:

final NumberToken t = numberTokenParser.parse("123"); 
// t.value == 123 

final OpenListToken u = openListToken.parse("["); 
// Succeeds 

今私は番号のリストを表しよりもクラスである、ListExpressionのパーサを作るためにそれらを結合したいと思います。これは[1,2,3]のような文字列が、明らかではない[ 1, 2 ]のような文字列のために働く

openListTokenParser 
    .next(numberTokenParser.sepBy(commaTokenParser)) 
    .followedBy(closeListTokenParser) 

:私のようなものを試してみました。

いくつかのパーサーを取り、それらの間にwhitespace*を入れる演算子がありますか?

また、私のListExpressionパーサを、文字の代わりにTokenのインターフェイスインスタンスのストリーム上で動作させることはできますか?

+0

あなたは空白を無視したい –

+0

が@Mohsen_Fatemi正しい – sdgfsdh

+0

はこれを試してください: '静的最終パーサは= Parsers.or( Scanners.JAVA_LINE_COMMENT、 Scanners.JAVA_BLOCK_COMMENT、 Scanners.WHITESPACES).skipMany()は無視; ' –

答えて

1

Terminalsクラスの関数を使用してトークナイザを直接ビルドすることができます。あなたの場合、これは次のようになります:

まず、端末のセットを定義します。演算子、キーワード、言葉...

Terminals terminals = operators("[", "]", ","); 

当社のトークンは、その後のいずれか、当社の端末でトークン化されているかIntegerLiteralトークナイザ:整数の構文パーサから

Parser<?> tokens = Parsers.or(terminals.tokenizer(), IntegerLiteral.TOKENIZER); 

私たちの最終結果(トークンから構築されたタグ付きINTEGER)をカンマトークンで区切って、大括弧のトークンで区切ります。

Parser<?> parser = IntegerLiteral.PARSER.sepBy(terminals.token(",")).between(terminals.token("["), terminals.token("]")) 
    .from(tokens, Scanners.WHITESPACES.many().cast()); 

のEtほら:私たちは、これはfromの二番目の引数である(すべてのトークンの間に空白を無視?

System.out.println(parser.parse("[1,2,3]")); 
System.out.println(parser.parse("[ 1, 2 , 3 ] ")); 
System.out.println(parser.parse(" [1,2,3 ]")); 
System.out.println(parser.parse("[1, 2 , 3]")); 
+0

このトークン/文字列の二重性(jparsec)は間違いなく最初に混乱しています... – insitu

関連する問題

 関連する問題