Parser - axkr/symja_android_library GitHub Wiki

Scanning the input string

The first step in the Symja interpreter is scanning the input string. The scanner takes in raw source code as a series of characters and produce the tokens that are used in the parsers in the next steps.

The scanner can be found in the class:

  • org.matheclipse.parser.client.Scanner - it is the parent class for the two different parsers used in Symja.

Before producing the parsers tokens, all named (unicode-) characters in an input-string are substituted by the scanner with the corresponding unicode character code.

  • org.matheclipse.parser.client.Characters - for example in the substituteCharacters() method the input string "{\[Alpha], \[Phi], \[Pi]}" will be replaced with their corresponding unicode characters or predefined Symja constants "{α,ϕ,Pi}".

The two parsers can be found in the classes:

  • org.matheclipse.core.parser.ExprParser - which transforms parsed math expressions directly into the IExpr Class-hierarchy
  • org.matheclipse.parser.client.Parser - a client side (frontend) parser (package org.matheclipse.parser.client) which can be used for example for RPC calls or in a Google GWT environment

If an input expression couldn't be scanned or parsed the scanner or parser methods throw a SyntaxError exception:

  • org.matheclipse.parser.client.SyntaxError - syntax errors must be catched by the caller. The method SyntaxError#getMessage() can be used to print the syntax error.

ExprParser (package org.matheclipse.core.parser)

The following snippet creates the common Symja syntax parser and returns an IExpr Class-hierarchy

...
    final ExprParser parser = new ExprParser(EvalEngine.get(), ExprParserFactory.RELAXED_STYLE_FACTORY, true);
    IExpr expression = parser.parse("string-expression");
...

This snippet creates a Mathematica syntax parser and returns an IExpr Class-hierarchy

...
    static {
      Config.PARSER_USE_LOWERCASE_SYMBOLS = true;
    }
...
...
    final ExprParser parser = new ExprParser(EvalEngine.get(), ExprParserFactory.MMA_STYLE_FACTORY, false);
    IExpr expression = parser.parse("string-expression");
...

Parser (package org.matheclipse.parser.client)

This parser doesn't depend on an EvalEngine instance and can be used in clients to avoid the dependency to the complete Symja libraries by using only the package org.matheclipse.parser.client. The parser transforms a string into instances of the ASTNode base class.

The following snippet creates the common Symja syntax parser and returns an ASTNode instance:

...
    try {
      Parser p = new Parser(ASTNodeFactory.RELAXED_STYLE_FACTORY, false);
      ASTNode obj = p.parse("stringExpression");
    } catch (Exception e) {
      // handle syntax errors here 
    }
...

The JUnit test classes can be found in the file ParserTestCase.java.

This snippet creates a Mathematica syntax parser and returns an ASTNode instance:

...		
    try {
      Parser p = new Parser(ASTNodeFactory.MMA_STYLE_FACTORY, true);
      ASTNode obj = p.parse("stringExpression");
    } catch (Exception e) {
      // handle syntax errors here 
    }
...

The JUnit test classes can be found in the file RelaxedParserTestCase.java.

If necessary an ASTNode can be transformed to an IExpr with the AST2Expr class.

...		
    ASTNode node = .....
    IExpr expr = new AST2Expr(EvalEngine.get()).convert(node); 
...