Skip to content

LittleTheFu/cpl

Repository files navigation

-----------------------------------------------------------------------
# 核心结构 - 优先级从低到高:或 -> 连接 -> 量词 -> 原子

regex       ::=  term { '|' term }
              # 一个正则表达式是一个或多个 'term' 通过 '|' (或) 连接

term        ::=  factor { factor }
              # 一个 'term' 是一个或多个 'factor' 的连接 (隐式连接,例如 'ab' 表示 'a' 连接 'b')

factor      ::=  atom [ '*' | '+' | '?' ]
              # 一个 'factor' 是一个 'atom' 后面可选跟着一个量词 ('*', '+', '?')

atom        ::=  char_or_char_set | '(' regex ')'
              # 一个 'atom' 是一个单个字符/字符集,或者是一个用括号括起来的子正则表达式

# 字符和字符集定义 - 这是核心变化所在

char_or_char_set ::=  escaped_char | literal_char | char_set
                     # 一个字符或字符集可以是转义字符、字面字符,或者一个字符集定义

literal_char ::=  <任何字符,除了 '\', '(', ')', '*', '+', '?', '|', '[', ']'>
                # 字面字符是除了正则表达式元字符(本身有特殊含义)以外的任何字符。
                # 例如:'a', 'B', '0', '_', '=', '<', '!', '/', ';', ':', ',', '-' 等。

escaped_char ::=  '\' ( 's' | 'd' | 'w' |            # 字符类:空白、数字、单词字符
                       't' | 'n' | 'r' |             # 控制字符:制表、换行、回车
                       '+' | '*' | '?' |             # 转义元字符:加、星、问
                       '(' | ')' | '[' | ']' |       # 转义括号:左右圆括号、左右方括号
                       '|' | '\' )                   # 转义管道、转义反斜杠
                # 转义字符是反斜杠 '\' 后面跟着一个特定的字符,
                # 用于表示字符类、控制字符或元字符的字面含义。

char_set    ::=  '[' [ '^' ] (char_set_item { char_set_item }) ']'
                # 字符集以 '[' 开头,以 ']' 结尾。
                # 可选的 '^''[' 后面表示否定字符集 (匹配除了集合中所有字符以外的任何字符)。
                # 内部包含一个或多个 char_set_itemchar_set_item ::=  literal_char | escaped_char | range
                   # 字符集中的项可以是一个字面字符、一个转义字符,或者一个范围。

range ::= (digit_char | lowercase_letter | uppercase_letter) '-' (digit_char | lowercase_letter | uppercase_letter)
---------------------------------------------------------------------
// 1. 程序结构 (Program Structure)
// ---------------------------------------------------------------------

Program             ::=  FunctionDefinitionList EOF_TOKEN

FunctionDefinitionList ::=  FunctionDefinition FunctionDefinitionList
                        |  ε // 空,表示零个或多个函数定义

FunctionDefinition  ::=  TypeSpecifier Identifier '(' ParameterListOpt ')' CompoundStatement

ParameterListOpt    ::=  ParameterList
                        |  ε

ParameterList       ::=  TypeSpecifier Identifier ParameterListRest

ParameterListRest   ::=  ',' TypeSpecifier Identifier ParameterListRest
                        |  ε

// ---------------------------------------------------------------------
// 2. 语句 (Statements)
// ---------------------------------------------------------------------

Statement           ::=  DeclarationStatement
                        |  ExpressionStatement
                        |  CompoundStatement
                        |  SelectionStatement  // if-else
                        |  IterationStatement  // while
                        |  ReturnStatement
                        |  ';'                 // Empty statement

CompoundStatement   ::=  '{' StatementList '}'

StatementList       ::=  Statement StatementList
                        |  ε

DeclarationStatement ::=  TypeSpecifier Identifier OptionalInitializer ';'

OptionalInitializer ::=  '=' Expression
                        |  ε

ExpressionStatement ::=  OptionalExpression ';'

OptionalExpression  ::=  Expression
                        |  ε

// SelectionStatement 处理悬挂 else:优先匹配最近的 else
SelectionStatement  ::=  'if' '(' Expression ')' MatchedStatement
                        |  'if' '(' Expression ')' UnmatchedStatement

MatchedStatement    ::=  DeclarationStatement
                        |  ExpressionStatement
                        |  CompoundStatement
                        |  ReturnStatement
                        |  ';'
                        |  'if' '(' Expression ')' MatchedStatement 'else' MatchedStatement
                        |  'while' '(' Expression ')' MatchedStatement

UnmatchedStatement  ::=  'if' '(' Expression ')' Statement
                        |  'if' '(' Expression ')' MatchedStatement 'else' UnmatchedStatement
                        |  'while' '(' Expression ')' UnmatchedStatement


IterationStatement  ::=  'while' '(' Expression ')' Statement

ReturnStatement     ::=  'return' OptionalExpression ';'

// ---------------------------------------------------------------------
// 3. 表达式 (Expressions) - LR(1) 需要明确的优先级和结合性
//    优先级从低到高:Assignment -> Relational -> Additive -> Multiplicative -> Unary -> Postfix -> Primary
// ---------------------------------------------------------------------

Expression          ::=  AssignmentExpression

AssignmentExpression ::=  Identifier '=' AssignmentExpression // 右结合性
                        |  RelationalExpression

RelationalExpression ::=  AdditiveExpression RelationalOpRight

RelationalOpRight   ::=  ( '==' | '!=' | '<' | '<=' | '>' | '>=' ) AdditiveExpression RelationalOpRight
                        |  ε

AdditiveExpression  ::=  MultiplicativeExpression AdditiveOpRight

AdditiveOpRight     ::=  ( '+' | '-' ) MultiplicativeExpression AdditiveOpRight
                        |  ε

MultiplicativeExpression ::=  UnaryExpression MultiplicativeOpRight

MultiplicativeOpRight ::=  ( '*' | '/' ) UnaryExpression MultiplicativeOpRight
                        |  ε

UnaryExpression     ::=  ( '+' | '-' ) UnaryExpression // 一元正负
                        |  PostfixExpression

PostfixExpression   ::=  PrimaryExpression PostfixOpRight

PostfixOpRight      ::=  '(' ArgumentListOpt ')' PostfixOpRight // 函数调用
                        |  ε

ArgumentListOpt     ::=  ArgumentList
                        |  ε

ArgumentList        ::=  Expression ArgumentListRest

ArgumentListRest    ::=  ',' Expression ArgumentListRest
                        |  ε

PrimaryExpression   ::=  Identifier
                        |  IntegerConstant
                        |  '(' Expression ')'

// ---------------------------------------------------------------------
// 4. 终结符 (Terminals / Lexical Tokens)
//    (这些是词法分析器识别的最小单位,你需要在 TokenType 中定义它们)
// ---------------------------------------------------------------------

TypeSpecifier       ::=  INT // 对应 TokenType::INT
Identifier          ::=  // 对应 TokenType::IDENTIFIER
IntegerConstant     ::=  // 对应 TokenType::INTEGER
EOF_TOKEN           ::=  // 对应 TokenType::EOF_TOKEN
'+'                 ::=  // 对应 TokenType::PLUS
'-'                 ::=  // 对应 TokenType::MINUS
'*'                 ::=  // 对应 TokenType::MULTIPLY
'/'                 ::=  // 对应 TokenType::DIVIDE
'='                 ::=  // 对应 TokenType::ASSIGN
'=='                ::=  // 对应 TokenType::EQUAL
'!='                ::=  // 对应 TokenType::NOT_EQUAL
'<'                 ::=  // 对应 TokenType::LESS
'<='                ::=  // 对应 TokenType::LESS_EQUAL
'>'                 ::=  // 对应 TokenType::GREATER
'>='                ::=  // 对应 TokenType::GREATER_EQUAL
'('                 ::=  // 对应 TokenType::L_PAREN (需要新增 TokenType)
')'                 ::=  // 对应 TokenType::R_PAREN (需要新增 TokenType)
'{'                 ::=  // 对应 TokenType::L_BRACE (需要新增 TokenType)
'}'                 ::=  // 对应 TokenType::R_BRACE (需要新增 TokenType)
';'                 ::=  // 对应 TokenType::SEMICOLON (需要新增 TokenType)
','                 ::=  // 对应 TokenType::COMMA (需要新增 TokenType)
'if'                ::=  // 对应 TokenType::IF
'else'              ::=  // 对应 TokenType::ELSE
'while'             ::=  // 对应 TokenType::WHILE
'return'            ::=  // 对应 TokenType::RETURN
// 注意: `ε` 表示空串,不对应任何 Token

// 1. 表达式 (Expressions) Expr ::= Expr '+' Term | Expr '-' Term | Term

Term ::= Term '*' Factor | Term '/' Factor | Factor

Factor ::= '(' Expr ')' | Identifier // 变量,如 'x', 'y' | IntegerConstant // 数字,如 '123'

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published