当前位置:  开发笔记 > 编程语言 > 正文

Antlr:识别日期和数字的最简单方法?

如何解决《Antlr:识别日期和数字的最简单方法?》经验,为你挑选了1个好方法。

在同一语法中解析有效日期和数字的最简单(最短,最少规则,没有警告)的方法是什么?我的问题是匹配有效月份(1-12)的词法分析器规则将匹配任何1-12的出现.所以,如果我只想匹配一个数字,我需要一个解析规则,如:

number: (MONTH|INT);

当我为日和年添加词法分析规则时,它变得更加复杂.我想要一个像这样的日期解析规则:

date: month '/' day ( '/' year )? -> ^('DATE' year month day);

我不关心月,日和年是解析还是词法分析器规则,只要我最终得到相同的树结构.我还需要能够识别其他地方的数字,例如:

foo: STRING OP number -> ^(OP STRING number);
STRING: ('a'..'z')+;
OP: ('<'|'>');

Douglas Mayl.. 5

问题是您似乎想要在词法分析器和/或解析器中执行语法和语义检查.这是一个常见的错误,只有在非常简单的语言中才有可能.

你真正需要做的是在词法分析器和解析器中更广泛地接受,然后执行语义检查.你对lexing的严格程度取决于你,但你有两个基本选择,取决于你是否需要在每月之前接受零:1)真正接受你的INT,2)定义DATENUM到只接受那些有效日期但不是有效INT的令牌.我建议第二个,因为代码后面需要的语义检查较少(因为INTs在语法级别可以验证,你只需要对你的日期进行语义检查.第一种方法:

INT: '0'..'9'+;

第二种方法:

DATENUM: '0' '1'..'9';
INT: '0' | SIGN? '1'..'9' '0'..'9'*;

在词法分析器中接受使用这些规则后,您的日期字段将是:

date: INT '/' INT ( '/' INT )?

要么:

date: (INT | DATENUM) '/' (INT | DATENUM) ('/' (INT | DATENUM) )?

之后,您将对AST执行语义运行,以确保您的日期有效.

但是,如果您在语法中执行语义检查,那么ANTLR允许在解析器中使用语义谓词,因此您可以创建一个日期字段来检查这样的值:

date: month=INT '/' day=INT ( year='/' INT )? { year==null ? (/* First check /*) : (/* Second check */)}

但是,当您执行此操作时,您将在语法中嵌入特定于语言的代码,并且无法跨目标移植.



1> Douglas Mayl..:

问题是您似乎想要在词法分析器和/或解析器中执行语法和语义检查.这是一个常见的错误,只有在非常简单的语言中才有可能.

你真正需要做的是在词法分析器和解析器中更广泛地接受,然后执行语义检查.你对lexing的严格程度取决于你,但你有两个基本选择,取决于你是否需要在每月之前接受零:1)真正接受你的INT,2)定义DATENUM到只接受那些有效日期但不是有效INT的令牌.我建议第二个,因为代码后面需要的语义检查较少(因为INTs在语法级别可以验证,你只需要对你的日期进行语义检查.第一种方法:

INT: '0'..'9'+;

第二种方法:

DATENUM: '0' '1'..'9';
INT: '0' | SIGN? '1'..'9' '0'..'9'*;

在词法分析器中接受使用这些规则后,您的日期字段将是:

date: INT '/' INT ( '/' INT )?

要么:

date: (INT | DATENUM) '/' (INT | DATENUM) ('/' (INT | DATENUM) )?

之后,您将对AST执行语义运行,以确保您的日期有效.

但是,如果您在语法中执行语义检查,那么ANTLR允许在解析器中使用语义谓词,因此您可以创建一个日期字段来检查这样的值:

date: month=INT '/' day=INT ( year='/' INT )? { year==null ? (/* First check /*) : (/* Second check */)}

但是,当您执行此操作时,您将在语法中嵌入特定于语言的代码,并且无法跨目标移植.

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有