锁定是一个从解析表达式语法(PEGs)生成 Objective-C 递归下降解析器的工具。
此代码及其生成的代码均在公共领域。
pegged [--version] [--help] [--output-dir directory] file
锁定从 PEG 语法生成 Objective-C 解析器。它生成的解析器是可重入的,线程安全的,并且不泄漏内存:它们适用于包含在其他程序中。
锁定读取文件中指定的语法,并将创建一个相同名称的类。然后将在输出目录中创建一个 .h 和一个 .m 文件,输出目录可以从命令行指定,默认为包含 PEG 语法的目录。解析器类遵循一个简单的接口
@protocol ParserDataSource;
typedef NSObject<ParserDataSource> ParserDataSource;
@interface Parser : NSObject
{
}
@property (retain) ParserDataSource *dataSource;
- (BOOL) parse;
- (BOOL) parseString:(NSString *)string;
@end
@protocol ParserDataSource
- (NSString *) nextString;
@end
要解析的数据可以通过数据源(响应单个选择器 -nextString)或通过 -parseString: 选择器提供。
--version Print version information and exit
--help Print help and exit
--output-dir Write generated files to the specified directory
以下是一个简单的示例:一个基本的计算器。
@property (retain) Calculator *calculator;
Equation <- Sum EndOfFile
Sum <- Product ( PLUS Product { [self.calculator add]; }
/ MINUS Product { [self.calculator subtract]; }
)*
Product <- Terminal ( MUL Terminal { [self.calculator multiply]; }
/ DIV Terminal { [self.calculator divide]; }
)*
Terminal <- OPEN Primary CLOSE
/ Number { [self.calculator pushNumber:text]; }
Number <- < [0-9+] > _
OPEN <- '(' _
CLOSE <- ')' _
MUL <- '*' _
DIV <- '/' _
PLUS <- '+' _
MINUS <- '-' _
_ <- ' '*
EndOfFile <- !.
语法首先指定一个选项和任何所需的 Objective-C 属性。这些属性添加到生成的解析器类中,包括所需的成员变量、@class 声明和 #import 语句。
接下来是一系列的规则,其中一些具有动作。这些动作在解析完成后执行。在计算器的例子中,数字被添加到堆栈中,并通过添加为属性的 Calculator 对象进行基本操作。