#parser #makefile #command #educational #basic #targets #syntax

bin+lib rolyng_basic_make_parser

用于教育目的的基本 make 解析器

1 个不稳定版本

0.1.2 2023年11月21日

#20 in #makefile

GPL-3.0-only

19KB
126

rolyng_basic_make_parser

用于教育目的的基本 make 语法解析器

描述

  • 为解析基本 Makefile 创建的 Make 语法解析器
  • 支持基本目标、依赖和命令

语法

file = {SOI ~ line+ ~ EOI}
line = {(EMPTY_LINE | rule)}
rule = {rule_header ~ recipe}
rule_header = {rule_name ~ ":" ~ dependencies? ~ "\n"}
dependencies = {identifier ~ ("," ~ identifier)*}
rule_name = {identifier}
recipe = {EMPTY_LINE | (recipe_command+)}
recipe_command = { RECIPE_PREFIX ~ shell_command ~ "\n"}
shell_command = @{(!"\n" ~ ANY)+}
identifier = @{ ASCII_ALPHA ~ (ASCII_ALPHANUMERIC | "_")* }

RECIPE_PREFIX = _{"\t"}
EMPTY_LINE = _{"\n"}
WHITESPACE = _{ " " }
COMMENT = _{ "#" ~ (!"\n" ~ ANY)*}
  • file - 解析 Makefile 的主规则
  • line - 每行文本的规则。可以是空的或 make 规则
  • rule - 由标题和配方组成的规则
  • rule_header - make 规则的标题,包含其名称和依赖项
  • dependencies - 在这个基本解析器中,基本上是由命令分隔的标识符
  • rule_name - 规则名称的标识符
  • recipe - 可以是空的或由一些 recipe_commands 组成
  • recipe_command - 以 RECIPE_PREFIX 开始,通常 make 中的 \t,之后包含在 shell 中执行的命令。以换行符结束
  • shell_command - 不包含换行的任何内容
  • identifier - 以符号开始,后跟任何数字字母或 '_'. 也不能包含空格

用法

./rolyng_basic_make_parser -h or --help or help #show help
./rolyng_basic_make_parser -V #show version
./rolyng_basic_make_parser -f or --file <file> #parse a file
./rolyng_basic_make_parser author #prints author

示例

#comment
aaa: bbb, ccc #comment
	echo ab

bbb: adsa
	echo bbb

ccc:
	echo ccc
	cat boba

ddd:

输出

Rule 
	name: aaa
	dependencies: bbb,ccc,
	commands:
		echo ab
		
Rule 
	name: bbb
	dependencies: adsa,
	commands:
		echo bbb
		
Rule 
	name: ccc
	dependencies: 
	commands:
		echo ccc
		cat boba
		
Rule 
	name: ddd
	dependencies: 
	commands:
		

依赖项

~4MB
~75K SLoC