/** * オプションの指定 */ options { LOOKAHEAD = 1; // 先読みトークン数 STATIC = false; // true にするとスタティックメソッドを生成 UNICODE_INPUT = true; // true にすると Unicode 入力を扱う DEBUG_PARSER = false; // true にするとデバグ情報出力 } /** * 作成する構文解析クラスの定義 * PARSER_BEGIN (クラス名) * と * PARSER_END (クラス名) * の間に作成するクラスの main メソッドを記述する。 */ PARSER_BEGIN (Parser) package kc; import java.util.*; import java.io.*; /** * Macro statements are as follows : *
::= "main" "(" ")" "{" { | } "}" EOF * ::= "int" { "," } ";" * ::= NAME * ::= | | | | "{" { } "}" * ::= "if" "(" ")" * ::= "while" "(" ")" * ::= "outputint" "(" ")" ";" * ::= Name "=" ";" * ::= { ( "+" | "-" ) } * ::= { ( "*" | "/" ) } * ::= NAME | INTEGER | "inputint" * * Execute as follows : * $ javac kc/Parser.java * $ java kc.Parser inputfile */ public class Parser { public static void main (String[] args) { try { Parser parser = new Parser (new FileReader (args[0])); parser.enable_tracing(); // デバグ情報収集 parser.Main(); } catch (Exception err_mes) { // 構文エラーがあった場合 System.out.println (err_mes); // エラーメッセージを出力 } System.out.println ("finished"); } } PARSER_END (Parser) /** * 字句解析時変数の宣言 * 字句解析時に必要な変数があればここで宣言する。 */ TOKEN_MGR_DECLS : {} /** * 空白文字の定義 * 空白文字は * SKIP : * { * <パターン> * } * の形で定義され、パターンには正規表現を用いることができる。 */ SKIP : { <" " | "\t" | "\n" | "\r"> | <"//" (~["\n", "\r"])* ["\n","\r"]> | <"/*"> : IN_COMMENT } SKIP : { <~[]> | <"*/"> : DEFAULT } /** * トークンの定義 * トークンは * TOKEN : * { * <トークン名: パターン> * } * の形で定義され、パターンには正規表現を用いることができる。 */ TOKEN : { | | | | | | | | | | | | | | | | | } /** *
::= "main" "(" "{" { } { } "}" */ void Main() : {} { "main" "(" ")" "{" ( Decl() )* ( State() )* "}" } /** * ::= "int" { "," } */ void Decl() : {} { "int" Name() ( "," Name() )*";" } /** * ::= NAME */ void Name() : {} { } /** * ::= { | | | | "{" { } "} } */ void State() : {} { If() | While() | Output() | Assgn() | "{" ( State() )* "}" } /** * ::= "if" "(" ")" */ void If() : {} { "if" "(" Exp() ")" State() } /** * ::= "while" "(" ")" */ void While() : {} { "while" "(" Exp() ")" State() } /** * ::= "outputint" "(" ")" ; */ void Output() : {} { "outputint" "(" Exp() ")" ";" } /** * ::= NAME "=" ";" */ void Assgn() : {} { "=" Exp() ";" } /** * ::= { ( "+" | "-" ) } */ void Exp() : {} { Term() ( ( "+" | "-" ) Term() )* } /** * ::= { ( "*" | "/" ) } */ void Term() : {} { Factor() ( ( "*" | "/" ) Factor() )* } /** * ::= NAME | INTEGER | "inputint" */ void Factor() : {} { | | "inputint" }