条件——解析文法SableCC
Conditions - parsing grammar SableCC
我正在使用 sableCC 并尝试构建一个接受条件的语法 C.However 当我尝试在我的条件中添加括号时出现错误,因为与我的括号有冲突有为表达。
例如它接受 4 = 3 或 x = 95 mod 5 和 5 = 5 但没有任何 parentheses.Also 我觉得 'not' 语法规则不正确。
Helpers
tab = 9;
cr = 13;
lf = 10;
sign = '+' | '-';
digit = ['0'..'9'];
lowercase = ['a'..'z'];
uppercase = ['A'..'Z'];
letter = lowercase | uppercase;
idletter = letter | '_';
idchar = letter | '_' | digit;
Tokens
number = [digit - '0'] digit*;
id = idletter idchar*;
plus = '+';
minus = '-';
times = '*';
div = 'div';
mod = 'mod';
equal = '=';
hash = '#';
greater = '>';
greateq = '>=';
less = '<';
lesseq = '<=';
not = 'not';
and = 'and';
or = 'or';
lparen = '(';
rparen = ')';
eol = cr | lf | cr lf;
blank = ' ' | tab;
Ignored Tokens
eol, blank;
Productions
program = compare*;
expr = {term} term
| {add} expr plus term
| {sub} expr minus term
;
term = {factor} factor
| {times} term times factor
| {div} term div factor
| {mod} term mod factor
;
factor = {number} number
| {id} id
| {expr} lparen expr rparen
;
compare = {cond} cond |
{gr}compare greater cond |
{gq}compare greateq cond |
{ls}compare less cond |
{lq}compare lesseq cond |
{eq}compare equal cond |
{not} not cond
;
cond = {expr} expr |
{and} cond and expr |
{or} cond or expr
;
如果您真的想接受条件 "like in C",那么您只需将条件设为 expr
的另一种形式,因为它们就是这样:它们是表达式,其值恰好总是在 {0, 1}
范围内。但它们在其他方面没有什么不同:
a = (x < y) + 3 * (x == z || x < 6);
是一个完全可以接受的表达式(尽管它可能不会经常出现在 C 程序中)。
因此,如果您只是将最后一个 factor
作品更改为 lparen cond rparen
(或将 cond
重命名为 expr
并找到其他词来命名您当前调用的作品expr
), 括号条件问题全部消失
还有许多其他 SO 问题可以解决此问题。这里有一些:
How to remove shift/reduse warning?
reduce/reduce conflicts using ocamlyacc
我正在使用 sableCC 并尝试构建一个接受条件的语法 C.However 当我尝试在我的条件中添加括号时出现错误,因为与我的括号有冲突有为表达。 例如它接受 4 = 3 或 x = 95 mod 5 和 5 = 5 但没有任何 parentheses.Also 我觉得 'not' 语法规则不正确。
Helpers
tab = 9;
cr = 13;
lf = 10;
sign = '+' | '-';
digit = ['0'..'9'];
lowercase = ['a'..'z'];
uppercase = ['A'..'Z'];
letter = lowercase | uppercase;
idletter = letter | '_';
idchar = letter | '_' | digit;
Tokens
number = [digit - '0'] digit*;
id = idletter idchar*;
plus = '+';
minus = '-';
times = '*';
div = 'div';
mod = 'mod';
equal = '=';
hash = '#';
greater = '>';
greateq = '>=';
less = '<';
lesseq = '<=';
not = 'not';
and = 'and';
or = 'or';
lparen = '(';
rparen = ')';
eol = cr | lf | cr lf;
blank = ' ' | tab;
Ignored Tokens
eol, blank;
Productions
program = compare*;
expr = {term} term
| {add} expr plus term
| {sub} expr minus term
;
term = {factor} factor
| {times} term times factor
| {div} term div factor
| {mod} term mod factor
;
factor = {number} number
| {id} id
| {expr} lparen expr rparen
;
compare = {cond} cond |
{gr}compare greater cond |
{gq}compare greateq cond |
{ls}compare less cond |
{lq}compare lesseq cond |
{eq}compare equal cond |
{not} not cond
;
cond = {expr} expr |
{and} cond and expr |
{or} cond or expr
;
如果您真的想接受条件 "like in C",那么您只需将条件设为 expr
的另一种形式,因为它们就是这样:它们是表达式,其值恰好总是在 {0, 1}
范围内。但它们在其他方面没有什么不同:
a = (x < y) + 3 * (x == z || x < 6);
是一个完全可以接受的表达式(尽管它可能不会经常出现在 C 程序中)。
因此,如果您只是将最后一个 factor
作品更改为 lparen cond rparen
(或将 cond
重命名为 expr
并找到其他词来命名您当前调用的作品expr
), 括号条件问题全部消失
还有许多其他 SO 问题可以解决此问题。这里有一些:
How to remove shift/reduse warning?
reduce/reduce conflicts using ocamlyacc