os

An operating system
git clone https://erai.gay/code/os/
Log | Files | Refs | README | LICENSE

commit 13d70d8ba0235a3c20647c12dbf18d25032e1276
parent 41e5f72ad30368e6ba023cf4453b4c08f191b627
Author: erai <erai@omiltem.net>
Date:   Fri, 28 Mar 2025 02:40:21 +0000

add lalr and lexer peg grammars

Diffstat:
Mcc3.om | 20+++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/cc3.om b/cc3.om @@ -1,5 +1,5 @@ peg_grammar { - grammar = sp (enum_decl / struct_decl / union_decl / func_decl / peg_grammar)* !.; + grammar = sp (enum_decl / struct_decl / union_decl / func_decl / peg_grammar / lalr_grammar / lexer_spec)* !.; enum_item = ident sp ("=" sp expr)?; enum_decl = enum sp "{" sp (enum_item ("," sp enum_item)*)? ("," sp)? "}" sp; @@ -148,4 +148,22 @@ peg_grammar { peg_class = "[[" ( !"]" ( . "-" . / . ) )* "]]"; peg_call = peg_identifier !(sp "="); peg_identifier = [[a-zA-Z0-9_]]+; + + lalr_primary = "(" sp lalr_pattern ")" sp / ident sp; + lalr_op = "*" / "+" / "?"; + lalr_suffix = lalr_primary (lalr_op sp)*; + lalr_alternative = lalr_suffix*; + lalr_pattern = lalr_alternative ("|" sp lalr_alternative)*; + lalr_rule = ident sp "=" sp lalr_pattern ";" sp; + lalr_grammar = "lalr" sp "{" sp lalr_rule+ "}" sp; + + lexer_dot = "."; + lexer_op = "*" / "+" / "?"; + lexer_charset = "[[" ( !"]" !"\\" . / "\\" . )* "]]"; + lexer_primary = "(" sp lexer_pattern ")" sp / lexer_dot sp / str sp / lexer_dot sp / lexer_charset sp; + lexer_suffix = lexer_primary (lexer_op sp)*; + lexer_alternative = lexer_suffix*; + lexer_pattern = lexer_alternative ("|" sp lexer_alternative)*; + lexer_rule = ident sp "=" sp lexer_pattern ";" sp; + lexer_spec = "lexer" sp "{" sp lexer_rule+ "}" sp; }