Parsing 允许状态变量的公共Lisp lexer生成器

Parsing 允许状态变量的公共Lisp lexer生成器,parsing,common-lisp,yacc,lex,sbcl,Parsing,Common Lisp,Yacc,Lex,Sbcl,通常引用的两个主要lexer生成器cl-lex和lispbuilder-lexer都不允许在“动作块”中使用状态变量,因此无法识别c风格的多行注释 什么是Common Lisp中的lexer生成器,它可以将c样式的多行注释识别为标记 更正:这个lexer实际上需要识别嵌套的、平衡的多行注释(不完全是C风格)。因此,我不能删除状态变量。您可以使用以下正则表达式识别C样式的多行注释: [/][*][^*]*[*]+([^*/][^*]*[*]+)*[/] 它应该与任何使用Posix兼容的扩展正则表

通常引用的两个主要lexer生成器cl-lex和lispbuilder-lexer都不允许在“动作块”中使用状态变量,因此无法识别c风格的多行注释

什么是Common Lisp中的lexer生成器,它可以将c样式的多行注释识别为标记


更正:这个lexer实际上需要识别嵌套的、平衡的多行注释(不完全是C风格)。因此,我不能删除状态变量。

您可以使用以下正则表达式识别C样式的多行注释:

[/][*][^*]*[*]+([^*/][^*]*[*]+)*[/]

它应该与任何使用Posix兼容的扩展正则表达式语法的库一起工作;虽然有点难读,因为
*
被广泛用作运算符和文字字符,但它没有使用非常规功能。它确实依赖于与换行符匹配的倒排字符类(
[^*]
),但这是一个非常通用的类,即使对于通配符与换行符不匹配的正则表达式引擎也是如此。

实际上,在我的例子中,我需要识别平衡的嵌套多行元素。所以我认为我需要一个注释级别的状态variable@erjoalgo:是的,这些不是C样式,并且它们不能用正则表达式识别。很抱歉给你带来困惑。谢谢你指出这一点。我知道这是可能的,但根据我的经验,这(允许在组中重复,而不是只允许简单的角色类)似乎很少得到支持?我可能错了。@erjoalgo:它肯定在每个标准正则表达式库中都有,在我熟悉的所有词法生成器中都有。我不熟悉你提到的那些,但我检查了他们的文档:
lispbuilder lexer
简要文档包括,例如,
“[0-9]+([.][0-9]+([Ee][0-9]+)?”
(这是一个可选组,不是重复组,但原理大致相同),而且库
cl-lex
使用的声明大多与Perl兼容,因此如果它不允许重复组,那将非常令人惊讶。是的,我知道它在大多数词法生成器中都可用。我认为这是这两个cl Lexer的另一个缺点,它们似乎不允许在命名的Subrokens上构建