JavaCC语法定义与编译 | AI生成和翻译

Home 2025.03

/* JavaCC 语法基础示例 */

// 选项设置与解析器类声明
options {
    STATIC = false;  // 允许多个解析器实例
    LOOKAHEAD = 2;   // 设置前瞻词法符号数为2
}

PARSER_BEGIN(SimpleParser)
public class SimpleParser {
    public static void main(String[] args) throws ParseException {
        SimpleParser parser = new SimpleParser(System.in);
        parser.Start();
    }
}
PARSER_END(SimpleParser)

// 词法规范(词法符号定义)
TOKEN : {
    // 关键字
    < VAR: "var" >
    < INT: "int" >
    < BOOLEAN: "boolean" >
    < STRING: "string" >

    // 字面量与标识符
    < NUMBER: (["0"-"9"])+ >
    < IDENTIFIER: ["a"-"z","A"-"Z","_"] (["a"-"z","A"-"Z","0"-"9","_"])* >

    // 运算符与标点符号
    < ASSIGN: "=" >
    < SEMICOLON: ";" >
    < PLUS: "+" >
    < MINUS: "-" >
    < MULTIPLY: "*" >
    < DIVIDE: "/" >
    < LPAREN: "(" >
    < RPAREN: ")" >
}

// 跳过空白字符与注释
SKIP : {
    " " | "\t" | "\n" | "\r"
    | <SINGLE_LINE_COMMENT: "//" (~["\n","\r"])* ("\n"|"\r"|"\r\n")>
    | <MULTI_LINE_COMMENT: "/*" (~["*"])* "*" ("*" | (~["*","/"] (~["*"])* "*"))* "/">
}

// 语法规则定义
void Start() : {} {
    (Statement())* <EOF>
}

void Statement() : {} {
    VariableDeclaration()
    | Expression()
    | AssignmentStatement()
}

void VariableDeclaration() : {} {
    // 语法:var [类型] [标识符] (= [表达式])?;
    <VAR> Type() <IDENTIFIER> 
    ( <ASSIGN> Expression() )? 
    <SEMICOLON>
}

void Type() : {} {
    <INT> | <BOOLEAN> | <STRING>
}

void Expression() : {} {
    AdditiveExpression()
}

void AdditiveExpression() : {} {
    MultiplicativeExpression() 
    (
        <PLUS> MultiplicativeExpression()
        | <MINUS> MultiplicativeExpression()
    )*
}

void MultiplicativeExpression() : {} {
    PrimaryExpression() 
    (
        <MULTIPLY> PrimaryExpression()
        | <DIVIDE> PrimaryExpression()
    )*
}

void PrimaryExpression() : {} {
    <NUMBER>
    | <IDENTIFIER>
    | <LPAREN> Expression() <RPAREN>
}

void AssignmentStatement() : {} {
    <IDENTIFIER> <ASSIGN> Expression() <SEMICOLON>
}

以下是对 JavaCC 及该语法示例的详细说明:

JavaCC 概述

JavaCC(Java 编译器编译器)是一个解析器生成工具,可帮助您为自定义语言或领域特定语言创建解析器和词法分析器。

示例中的关键组件:

  1. 选项设置块
    • STATIC = false:允许创建多个解析器实例
    • LOOKAHEAD = 2:设置解析器向前查看2个词法符号以消除歧义
  2. 词法符号定义
    • 定义关键字、标识符、数字和运算符等词法符号
    • 使用正则表达式匹配词法符号模式
    • 示例词法符号:
      • < NUMBER: (["0"-"9"])+ > 匹配一个或多个数字
      • < IDENTIFIER: ["a"-"z","A"-"Z","_"] (["a"-"z","A"-"Z","0"-"9","_"])* > 匹配变量名
  3. 跳过规则定义
    • 定义解析过程中需要忽略的内容(空白字符、注释)
    • 包含单行和多行注释处理
  4. 语法规则
    • 定义语言的语法和结构
    • 使用递归下降解析方法
    • VariableDeclaration()Expression() 等规则定义了语言结构

编译与使用步骤

  1. 生成解析器
    javacc SimpleParser.jj
    

    此命令将生成:

    • SimpleParserConstants.java
    • SimpleParserTokenManager.java
    • ParseException.java
    • SimpleParser.java
  2. 编译生成的文件
    javac *.java
    
  3. 运行解析器
    java SimpleParser
    

示例输入

var int x = 10;
var int y = 20;
x = x + y;

已演示功能

本示例的局限性

高级使用技巧

您是否需要我详细说明 JavaCC 或此语法示例的任何特定方面?


Back Donate