Parsing 使用上下文无关语法

Parsing 使用上下文无关语法,parsing,boolean,context-free-grammar,Parsing,Boolean,Context Free Grammar,我正在尝试为个人项目编写一个简单的解析器。作为一个开始练习,我正在尝试编写计算简单布尔语句的代码。例如,如果我给解析器以下字符串: true和(true或false) 它应该是真的 我的理解是,定义上下文无关语法是编写解析器的第一步。定义适合我的简单布尔语句的上下文无关语法很容易: S => S OR S S => S AND S S => (S) S => true S => false 然而,我不明白下一步。如何使用此语法开始计算语句?我完全错了吗?语法的le

我正在尝试为个人项目编写一个简单的解析器。作为一个开始练习,我正在尝试编写计算简单布尔语句的代码。例如,如果我给解析器以下字符串:

true和(true或false)

它应该是真的

我的理解是,定义上下文无关语法是编写解析器的第一步。定义适合我的简单布尔语句的上下文无关语法很容易:

S => S OR S
S => S AND S
S => (S)
S => true
S => false

然而,我不明白下一步。如何使用此语法开始计算语句?我完全错了吗?

语法的lexer定义文件(bool.l)可能是这样的:

%{
#include "y.tab.h"
%}
%%
"true"   return TRUE;
"false"  return FALSE;
"OR"     return OR;
"AND"    return AND;
"("  return '(';
")"  return ')';
[ \t]    {}
\n   return 0;
.    return *yytext;
%%
这会将输入流解析为令牌。解析器调用lexer,它每次返回下一个标记。还可以返回数字等标记,并将变量设置为实际读取的数字(字符串文本、标识符等也是如此)

语法定义(bool.y):

然后像这样开始:

echo false OR true | bool
或者使用
/bool
,并在标准文本中输入您的术语

Yacc从定义文件构建一个LALR(1)shift/reduce解析器


如果您想深入了解yacc如何生成解析器,请在生成时指定
-v
选项,然后yacc会将状态机的描述(何时移位、何时缩减)写入
y。输出

通常的方法是先编写一个lexer来标记输入流,然后使用PDA来解析语法。这项任务的有用工具是(f)lex和yacc/bison。对这个过程有更详细的描述吗?我不明白如何在语法上使用PDA。
yacc -d bool.y
flex bool.l
gcc -O2 y.tab.c lex.yy.c -o bool -ll -ly
echo false OR true | bool