c0 语法说明
c0 是一个用于编译原理课程的微型语言。c0 提供的功能类似于 C,但是为了减少编译器实现的压力(减少前瞻和/或回溯),在语言风格上大量参考了 Rust 的设计。请注意,这个语言并不是对 Rust 语言的简化。
语法定义
以下是 c0 语言的全部语法定义,包括所有扩展语法。
// # 单词
// ## 关键字
FN_KW -> 'fn'
LET_KW -> 'let'
CONST_KW -> 'const'
AS_KW -> 'as'
WHILE_KW -> 'while'
IF_KW -> 'if'
ELSE_KW -> 'else'
RETURN_KW -> 'return'
BREAK_KW -> 'break'
CONTINUE_KW -> 'continue'
// ## 字面量
digit -> [0-9]
UINT_LITERAL -> digit+
DOUBLE_LITERAL -> digit+ '.' digit+ ([eE] digit+)?
escape_sequence -> '\' [\\"'nrt]
string_regular_char -> [^"\\]
STRING_LITERAL -> '"' (string_regular_char | escape_sequence)* '"'
char_regular_char -> [^'\\]
CHAR_LITERAL -> '\'' (char_regular_char | escape_sequence) '\''
// ## 标识符
IDENT -> [_a-zA-Z] [_a-zA-Z0-9]*
// ## 符号
PLUS -> '+'
MINUS -> '-'
MUL -> '*'
DIV -> '/'
ASSIGN -> '='
EQ -> '=='
NEQ -> '!='
LT -> '<'
GT -> '>'
LE -> '<='
GE -> '>='
L_PAREN -> '('
R_PAREN -> ')'
L_BRACE -> '{'
R_BRACE -> '}'
ARROW -> '->'
COMMA -> ','
COLON -> ':'
SEMICOLON -> ';'
// ## 注释
COMMENT -> '//' regex(.*) '\n'
// # 表达式
expr ->
operator_expr
| negate_expr
| assign_expr
| as_expr
| call_expr
| literal_expr
| ident_expr
| group_expr
binary_operator -> '+' | '-' | '*' | '/' | '==' | '!=' | '<' | '>' | '<=' | '>='
operator_expr -> expr binary_operator expr
negate_expr -> '-' expr
assign_expr -> l_expr '=' expr
as_expr -> expr 'as' ty
call_param_list -> expr (',' expr)*
call_expr -> IDENT '(' call_param_list? ')'
literal_expr -> UINT_LITERAL | DOUBLE_LITERAL | STRING_LITERAL | CHAR_LITERAL
ident_expr -> IDENT
group_expr -> '(' expr ')'
// ## 左值表达式
l_expr -> IDENT
// ## 类型
ty -> IDENT
// # 语句
stmt ->
expr_stmt
| decl_stmt
| if_stmt
| while_stmt
| break_stmt
| continue_stmt
| return_stmt
| block_stmt
| empty_stmt
expr_stmt -> expr ';'
let_decl_stmt -> 'let' IDENT ':' ty ('=' expr)? ';'
const_decl_stmt -> 'const' IDENT ':' ty '=' expr ';'
decl_stmt -> let_decl_stmt | const_decl_stmt
if_stmt -> 'if' expr block_stmt ('else' 'if' expr block_stmt)* ('else' block_stmt)?
while_stmt -> 'while' expr block_stmt
break_stmt -> 'break' ';'
continue_stmt -> 'continue' ';'
return_stmt -> 'return' expr? ';'
block_stmt -> '{' stmt* '}'
empty_stmt -> ';'
// # 函数
function_param -> 'const'? IDENT ':' ty
function_param_list -> function_param (',' function_param)*
function -> 'fn' IDENT '(' function_param_list? ')' '->' ty block_stmt
// # 程序
item -> function | decl_stmt
program -> item*
其中,表达式中运算符的优先级从高到低为:
运算符 | 结合性 |
---|---|
括号表达式 | - |
函数调用 | - |
前置 - | - |
as | - |
* / | 左到右 |
+ - | 左到右 |
> < >= <= == != | 左到右 |
= | 右到左 |
语法参考
以下是一些符合语法规范的程序。
fn fib(x: int) -> int {
if x<=1 {
return 1;
}
let result: int = fib(x - 1);
result = result + fib(x - 2);
return result;
}
fn main() -> int {
let i: int = 0;
let j: int;
j = getint();
while i < j {
putint(i);
putchar(32);
putint(fib(i));
putln();
i = i + 1;
}
return 0;
}