0

我有几个令牌:

PNAMEENAME- 都是字符串。

现在我想在我的词法分析器中设置 2 条规则,以匹配这些标记。

当字符串由字符 az 和可选的特殊字符 @/() 组成时,第一条规则( PNAME) 应该匹配。

ENAME当字符串由字符 az 和可选前缀 (#/.) 组成时,第二条规则( ) 应该匹配。

现在,我将如何在我的词法分析器文件中制定一条仅匹配的规则ENAME- 即使没有前缀?

如果它有任何区别,那么它的字符串后面ENAME会有一个: - 但是这个括号不应该传递给解析器......{(prefix)eName {

有什么建议么?

4

1 回答 1

2

如果这个问题与您之前的问题(关于解析 CSS)文件有关,那么您可能应该使用不同的方法。

词法分析器应该只识别简单的标记,例如#.(标记名称HASHDOT)、花括号(标记LCURLY和分别RCURLY{和)以及使用任何字符序列的正则表达式的}任何标识符。IDENTa-zA-Z

其余的处理(例如识别 CSS 规则.foo { ... })应该在解析器中完成。在我之前的回答中,我描述了如何解析属性名称列表 - 它假设您有navigators一个语法元素,它指定 HTML 元素,例如#nameor #name .class。您可以为这些编写单独的解析规则:

navigators = 
  | navigator            { [$1] }
  | navigator navigators { $1::$2 }
navigator = 
  | HASH IDENT   { SelectByID($2) }
  | DOT IDENT    { SelectByClass($1) }

有关编写解析器和词法分析器的更多信息,请参阅wikibooks 文章Chris Smith 的博客

于 2011-06-30T18:58:41.323 回答