package com.github.forax.smartass.grammar.tools; import java.io.InputStreamReader; import java.io.Reader; import com.github.forax.smartass.grammar.lexer.RuleEnum; import com.github.forax.smartass.grammar.parser.TerminalEnum; import com.github.forax.smartass.grammar.parser.NonTerminalEnum; import com.github.forax.smartass.grammar.parser.ProductionEnum; import com.github.forax.smartass.grammar.parser.VersionEnum; import com.github.forax.smartass.grammar.lexer.LexerDataTable; import com.github.forax.smartass.grammar.parser.ParserDataTable; import com.github.forax.smartass.grammar.tools.ToolsDataTable; import com.github.forax.smartass.grammar.tools.GrammarEvaluator; import com.github.forax.smartass.grammar.tools.TerminalEvaluator; import fr.umlv.tatoo.runtime.buffer.LexerBuffer; import fr.umlv.tatoo.runtime.buffer.TokenBuffer; import fr.umlv.tatoo.runtime.buffer.impl.LocationTracker; import fr.umlv.tatoo.runtime.buffer.impl.ReaderWrapper; import fr.umlv.tatoo.runtime.lexer.LexerTable; import fr.umlv.tatoo.runtime.parser.ParserTable; import fr.umlv.tatoo.runtime.tools.DataViewer; import fr.umlv.tatoo.runtime.tools.Debug; import fr.umlv.tatoo.runtime.tools.SemanticStack; import fr.umlv.tatoo.runtime.tools.ToolsTable; import fr.umlv.tatoo.runtime.tools.builder.Builder; /** Helper methods that can be used to run a couple lexer/parser on a text. * * This class is generated - please do not edit it */ public class Analyzers { /** * Runs the analyzer (lexer+parser) on a reader and print recognized tokens and * applied parser rules on error input (see {@link Debug}). * @param reader the source of standard input if null * @param terminalEvaluator the terminal evaluator or just method call printer if null * @param grammarEvaluator the grammar evaluator or just method call printer if null * @param start the start or default start if null * @param version the version of default version if null */ public static void runDebug(Reader reader, TerminalEvaluator<? super CharSequence> terminalEvaluator, GrammarEvaluator grammarEvaluator, NonTerminalEnum start, VersionEnum version) { if (reader==null) reader=new InputStreamReader(System.in); @SuppressWarnings("unchecked") TerminalEvaluator<CharSequence> debugTerminalEvaluator = Debug.createTraceProxy(TerminalEvaluator.class,terminalEvaluator); GrammarEvaluator debugGrammarEvaluator = Debug.createTraceProxy(GrammarEvaluator.class,grammarEvaluator); run(reader,debugTerminalEvaluator,debugGrammarEvaluator, start,version); } /** Runs the analyzer (lexer+parser) on a reader and sends recognized tokens * as CharSequence. Tokens are transformed to objects by the terminal evaluator. * At last, the grammar evaluator is called with these objects. * * This implementation uses a {@link fr.umlv.tatoo.runtime.buffer.impl.ReaderWrapper} * configured with a location tracker as buffer and calls. * * @param reader a reader used to obtain the characters of the text to parse. * @param terminalEvaluator an interface that returns the value of a token. * @param grammarEvaluator an interface that evaluates the grammar productions. * @param start a start non terminal of the grammar used as root state of the parser. * If start is null, * the {@link fr.umlv.tatoo.runtime.parser.ParserTable#getDefaultStart() default start} * non terminal is used. * @param version a version of the grammar used to parse the reader. * If version is null, * the {@link fr.umlv.tatoo.runtime.parser.ParserTable#getDefaultVersion() default version} * of the grammar is used. * * @see #run(TokenBuffer, TerminalEvaluator, GrammarEvaluator, NonTerminalEnum, VersionEnum) */ public static void run( Reader reader, TerminalEvaluator<? super CharSequence> terminalEvaluator, GrammarEvaluator grammarEvaluator, NonTerminalEnum start, VersionEnum version) { run(new ReaderWrapper(reader, new LocationTracker()), terminalEvaluator, grammarEvaluator, start, version); } public static <B extends TokenBuffer<D>&LexerBuffer,D> void runDebug( B tokenBuffer, TerminalEvaluator<? super D> terminalEvaluator, GrammarEvaluator grammarEvaluator, NonTerminalEnum start, VersionEnum version) { @SuppressWarnings("unchecked") TerminalEvaluator<? super D> debugTerminalEvaluator = Debug.createTraceProxy(TerminalEvaluator.class,terminalEvaluator); GrammarEvaluator debugGrammarEvaluator = Debug.createTraceProxy(GrammarEvaluator.class,grammarEvaluator); run(tokenBuffer,debugTerminalEvaluator,debugGrammarEvaluator, start,version); } /** Runs the analyzer (lexer+parser) on a token buffer and sends recognized tokens * as CharSequence. Tokens are transformed to objects by the terminal evaluator. * At last, the grammar evaluator is called with these objects. * * It is up to the caller to create its buffer and to provide or not a location tracker. * * @param <B> type of the buffer. * * @param tokenBuffer the token buffer used to obtain the characters of the text to parse. * @param terminalEvaluator an interface that returns the value of a token. * @param grammarEvaluator an interface that evaluates the grammar productions. * @param start a start non terminal of the grammar used as root state of the parser. * If start is null, * the {@link fr.umlv.tatoo.runtime.parser.ParserTable#getDefaultStart() default start} * non terminal is used. * @param version a version of the grammar used to parse the reader. * If version is null, * the {@link fr.umlv.tatoo.runtime.parser.ParserTable#getDefaultVersion() default version} * of the grammar is used. * * @see #run(Reader, TerminalEvaluator, GrammarEvaluator, NonTerminalEnum, VersionEnum) */ public static <B extends TokenBuffer<D>&LexerBuffer,D> void run( B tokenBuffer, TerminalEvaluator<? super D> terminalEvaluator, GrammarEvaluator grammarEvaluator, NonTerminalEnum start, VersionEnum version) { analyzerTokenBufferBuilder(tokenBuffer,terminalEvaluator,grammarEvaluator,new SemanticStack()). start(start).version(version).createLexer().run(); } public static Builder.LexerTableBuilder<RuleEnum> lexerBuilder() { return Builder.lexer(LexerDataTable.createTable()); } public static Builder.ParserTableBuilder<TerminalEnum,NonTerminalEnum,ProductionEnum,VersionEnum> parserBuilder() { return Builder.parser(ParserDataTable.createTable()); } public static Builder.AnalyzerTableBuilder<RuleEnum,TerminalEnum,NonTerminalEnum,ProductionEnum,VersionEnum> analyzerBuilder() { return Builder.analyzer(LEXER_TABLE,PARSER_TABLE,TOOLS_TABLE); } public static <B extends LexerBuffer> Builder.AnalyzerBuilder<RuleEnum,B,TerminalEnum,NonTerminalEnum,ProductionEnum,VersionEnum> analyzerLexerBufferBuilder(B lexerBuffer, TerminalEvaluator<? super B> terminalEvaluator, GrammarEvaluator grammarEvaluator, SemanticStack semanticStack) { return analyzerBuilder().buffer(lexerBuffer).listener(AnalyzerProcessor.<B,B>createAnalyzerProcessor(terminalEvaluator,grammarEvaluator, DataViewer.<B>getIdentityDataViewer(),semanticStack)); } public static <B extends TokenBuffer<D>&LexerBuffer,D> Builder.AnalyzerBuilder<RuleEnum,B,TerminalEnum,NonTerminalEnum,ProductionEnum,VersionEnum> analyzerTokenBufferBuilder(B tokenBuffer, TerminalEvaluator<? super D> terminalEvaluator, GrammarEvaluator grammarEvaluator, SemanticStack semanticStack) { return analyzerBuilder().buffer(tokenBuffer).listener(AnalyzerProcessor.<B,D>createAnalyzerProcessor(terminalEvaluator,grammarEvaluator, DataViewer.<D>getTokenBufferViewer(),semanticStack)); } private static final LexerTable<RuleEnum> LEXER_TABLE; private static final ParserTable<TerminalEnum,NonTerminalEnum,ProductionEnum,VersionEnum> PARSER_TABLE; private static final ToolsTable<RuleEnum,TerminalEnum> TOOLS_TABLE; static { LEXER_TABLE = LexerDataTable.createTable(); PARSER_TABLE = ParserDataTable.createTable(); TOOLS_TABLE = ToolsDataTable.createToolsTable(); } /* sample main method public static void main(String[] args) throws java.io.IOException { java.io.Reader reader; if (args.length>0) { reader = new java.io.FileReader(args[0]); } else { reader = new java.io.InputStreamReader(System.in); } //TODO implements the terminal attribute evaluator here TerminalEvaluator<CharSequence> terminalEvaluator = fr.umlv.tatoo.runtime.tools.Debug.createTraceProxy(TerminalEvaluator.class); //TODO implements the grammar evaluator here GrammarEvaluator grammarEvaluator = fr.umlv.tatoo.runtime.tools.Debug.createTraceProxy(GrammarEvaluator.class); //TODO choose a start non terminal and a version here VersionEnum version = VersionEnum.DEFAULT; NonTerminalEnum start = NonTerminalEnum.repl; Analyzers.run(reader, terminalEvaluator, grammarEvaluator, start, version); }*/ }