我正在与LEX和YACC合作。我有一个关于如何定义标记的问题,我的意思是我有两个共享一些字符的正则表达式,请参阅下面的示例:
SHARED "+"|"-"|"/"|"="|"%"|"?"|"!"|"."|"$"|"_"|"~"|"&"|"^"|"<"|">"|"("|")"|","
REXP_1 {SHARED}|[a-zA-Z]|[ \t]+|[\\][\\\"]
REXP_2 {SHARED}|[a-zA-Z]|[ \t]+|"*"
现在我的观点是当我在.lex文件的第三部分中定义标记时,如何识别共享正则表达式中的字符何时对应于REXP_1或REXP_2。
我认为我误解了一些东西,我想我写正则表达式的方式是错误的,但我找不到一种方法来更好地表达它。你能给我一些提示吗?
如果有人可以建议我确定何时定义令牌(file.lex)或何时在语法中定义符号(file.y),我会很感激。对于某些符号,很容易弄清楚它是一个标记还是一个语法符号,但对于其他一些符号,我发现很难定义放置它们的位置。
顺便说一句,我正在使用this grammar
答案 0 :(得分:1)
万一有人觉得有趣,我会写出我学到的课程。我认为我学到的最重要的一课是,常识是一个很好的工具,可以找出.lex文件中的实习代码是什么,以及与.y文件共享的合适代币。
由于术语常识&#39;可能有点模糊我发布以下示例:
ALPHA_NUMERIC [a-bA-B0-9] SQ_CHAR {SHARED}|{ALPHA_NUMERIC} SINGLE_QUOTED {SINGLE_QUOTE}{SQ_CHAR}{SQ_CHAR}*{SINGLE_QUOTE}
其中
ALPHA_NUMERIC
是一个好的实习生令牌(file.lex
)但是在语法文件中共享的错误令牌,而SINGLE_QUOTED
可能是与语法共享的好令牌({ {1}})。我写的可能是&#39;因为它非常依赖于我们正在处理的特定语法,在我的具体情况下,与YACC文件共享是一个很好的标记。我所做的是将一个正则表达式定义为类似于@OGHaza在
file.y
中建议我的正则表达式,然后我在语法本身(file.lex
)中使用它。