2017-02-09 5 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 

나는 또한 구현 tokenizers :

[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* 사이에 연산자가 있습니까?

또는 문자 대신 Token 인터페이스 인스턴스의 스트림에서 내 ListExpression 파서가 작동하도록 할 수 있습니까?

+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()); 

잇함으로써 해결할 수 : 우리는이 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