@Override public Object is(Object method) { if (expressionStack.size() != 1) { throw new IllegalStateException("Unexpected stack size: " + expressionStack.size()); } ParsingExpression expression = pop(); b.rule(ruleKey).is(expression); this.buildingMethod = null; this.ruleKey = null; return null; }
private static void createOthersType() { b.rule(QUALIFIED_IDENT).is(PACKAGE_NAME, GoLexer.Punctuators.DOT, IDENTIFIER); b.rule(TYPE_NAME).is(b.firstOf(IDENTIFIER, QUALIFIED_IDENT)); b.rule(POINTER_TYPE).is(GoLexer.Punctuators.MUL, TYPE); b.rule(TYPE_LIT).is(b.firstOf(ARRAY_TYPE, STRUCT_TYPE, POINTER_TYPE, FUNC_TYPE, INTERFACE_TYPE, SLICE_TYPE, MAP_TYPE, CHANNEL_TYPE)); b.rule(TYPE).is(b.firstOf(GO_TYPE, TYPE_LIT, TYPE_NAME, b.sequence(GoLexer.Punctuators.PAREN_R, TYPE, GoLexer.Punctuators.PAREN_L))); }
private static void punctuator(LexerlessGrammarBuilder b, GrammarRuleKey ruleKey, String value) { for (EcmaScriptPunctuator tokenType : EcmaScriptPunctuator.values()) { if (value.equals(tokenType.getValue())) { b.rule(tokenType).is(SPACING, value); return; } } throw new IllegalStateException(value); }
/** * @see https://golang.org/ref/spec#Struct_types */ private static void createStructDefinition() { b.rule(FIELD_DEFINITION_NORMAL).is(IDENTIFIER_LIST, TYPE); b.rule(FIELD_DEFINITION_ANOM).is(b.optional(GoLexer.Punctuators.MUL), TYPE_NAME); b.rule(FIELD_DEFINITION).is(b.firstOf(FIELD_DEFINITION_NORMAL, FIELD_DEFINITION_ANOM), b.optional(TAG)); b.rule(STRUCT_TYPE).is(GoLexer.Keyword.STRUCT, GoLexer.Punctuators.BRACE_L, b.zeroOrMore(FIELD_DEFINITION), GoLexer.Punctuators.BRACE_R); }
private static void punctuator(LexerlessGrammarBuilder b, GrammarRuleKey ruleKey, String value, Object element) { for (EcmaScriptPunctuator tokenType : EcmaScriptPunctuator.values()) { if (value.equals(tokenType.getValue())) { b.rule(tokenType).is(SPACING, value, element); return; } } throw new IllegalStateException(value); }
/** * @see https://golang.org/ref/spec#Method_expressions * MethodName==Identifier */ private static void createMethodExpr() { b.rule(RECEIVER_TYPE) .is(b.firstOf(TYPE_NAME, b.sequence(GoLexer.Punctuators.PAREN_R, TYPE_NAME, GoLexer.Punctuators.PAREN_L), b.sequence(GoLexer.Punctuators.PAREN_R, RECEIVER_TYPE, GoLexer.Punctuators.PAREN_L))); b.rule(METHOD_EXPR).is(b.sequence(RECEIVER_TYPE, GoLexer.Punctuators.DOT, IDENTIFIER)); }
private static void arrays(LexerfulGrammarBuilder b) { b.rule(ARRAY_INITIALIZER).is( LCURLYBRACE, b.optional( b.firstOf( b.sequence(VARIABLE_INITIALIZER_LIST, COMMA), VARIABLE_INITIALIZER_LIST)), RCURLYBRACE); b.rule(VARIABLE_INITIALIZER_LIST).is(VARIABLE_INITIALIZER, b.zeroOrMore(COMMA, VARIABLE_INITIALIZER)); }
private static void functions(LexerlessGrammarBuilder b) { b.rule(spec).is(minus, b.firstOf(semiKeyword("spec", b), semiKeyword("callback", b)), b.zeroOrMore(b.firstOf(b.regexp("\\.(\\.+|.)"), b.regexp("[^\\.]")), spacing), dot); b.rule(typeSpec).is(minus, b.firstOf(semiKeyword("type", b), semiKeyword("opaque", b)), b.zeroOrMore(b.firstOf(b.regexp("\\.(\\.+|.)"), b.regexp("[^\\.]")), spacing), dot); b.rule(functionDeclaration).is(functionClause, b.zeroOrMore(semi, functionClause), dot); b.rule(functionClause).is(clauseHead, arrow, clauseBody); b.rule(clauseHead).is(funcDecl, b.optional(guardSequenceStart)); b.rule(clauseBody).is(statements); b.rule(funcArity).is(b.optional(literal, colon), literal, div, literal); b.rule(funcDecl).is(literal, arguments); }
public void addAction(Method method, int stackElements) { method.setAccessible(true); GrammarRuleKey grammarRuleKey = new DummyGrammarRuleKey(method); actions.put(grammarRuleKey, method); ParsingExpression expression = stackElements == 1 ? pop() : new SequenceExpression(pop(stackElements)); b.rule(grammarRuleKey).is(expression); invokeRule(grammarRuleKey); }
@Override public <T> Optional<List<T>> zeroOrMore(T method) { ParsingExpression expression = pop(); GrammarRuleKey ruleKey = new DummyGrammarRuleKey("zeroOrMore", expression); zeroOrMores.add(ruleKey); b.rule(ruleKey).is(b.zeroOrMore(expression)); invokeRule(ruleKey); return null; }
@Override public <U> List<U> oneOrMore(U method) { ParsingExpression expression = pop(); GrammarRuleKey grammarRuleKey = new DummyGrammarRuleKey("oneOrMore", expression); oneOrMores.add(grammarRuleKey); b.rule(grammarRuleKey).is(b.oneOrMore(expression)); invokeRule(grammarRuleKey); return null; }
@Override public <U> Optional<List<U>> zeroOrMore(U method) { ParsingExpression expression = pop(); GrammarRuleKey grammarRuleKey = new DummyGrammarRuleKey("zeroOrMore", expression); zeroOrMores.add(grammarRuleKey); b.rule(grammarRuleKey).is(b.zeroOrMore(expression)); invokeRule(grammarRuleKey); return null; }
@Override public <T> Optional<List<T>> zeroOrMore(T method) { ParsingExpression expression = pop(); GrammarRuleKey ruleKey = new DummyGrammarRuleKey("zeroOrMore", expression); zeroOrMores.add(ruleKey); b.rule(ruleKey).is(b.zeroOrMore(expression)); invokeRule(ruleKey); return null; }
private static void punctuators(LexerlessGrammarBuilder b) { for (PHPPunctuator p : PHPPunctuator.values()) { b.rule(p).is(SPACING, p.getValue()).skip(); } }
private static void punctuators(LexerlessGrammarBuilder b) { for (PHPPunctuator p : PHPPunctuator.values()) { b.rule(p).is(SPACING, p.getValue()).skip(); } }
public void replaceByRule(GrammarRuleKey ruleKey, int stackElements) { ParsingExpression expression = stackElements == 1 ? pop() : new SequenceExpression(pop(stackElements)); b.rule(ruleKey).is(expression); invokeRule(ruleKey); }
public static LexerlessGrammarBuilder createGrammarBuilder() { LexerlessGrammarBuilder b = LexerlessGrammarBuilder.create(); b.rule(IDENTIFIER_NAME).is( SPACING, b.regexp(EcmaScriptLexer.IDENTIFIER)); lexical(b); b.setRootRule(SCRIPT); return b; }
public void replaceByRule(GrammarRuleKey ruleKey, int stackElements) { ParsingExpression expression = stackElements == 1 ? pop() : new SequenceExpression(pop(stackElements)); b.rule(ruleKey).is(expression); invokeRule(ruleKey); }
private static void spacing(LexerlessGrammarBuilder b, String commentRegex) { b.rule(SPACING).is( b.skippedTrivia(b.regexp("(?<!\\\\)[\\s]*+")), b.zeroOrMore( b.commentTrivia(b.regexp(commentRegex)), b.skippedTrivia(b.regexp("(?<!\\\\)[\\s]*+")))); }