私はsableCCを使用しています。私はCのような条件を受け入れる文法を構築しようとしています。私は括弧と矛盾しているので自分の条件に括弧を追加しようとするとエラーが発生します私はその表現を持っています。 たとえば、4 = 3またはx = 95 mod 5と5 = 5を受け取りますが、かっこはありません。また、 'not'文法規則が正しくないように感じます。条件文法の解析SableCC
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
;
あなたは電子たいとき以来、間違ってこのアプローチではありませんxpressionパーサーは条件も受け入れることができます。例えば、 。値割当の場合:id = expr; またはそれを@セマンティック分析で処理する必要がありますか? –
@AlexF:それは、2つの条件が式として使用されていることを示す例を含めて、Cについての私の指摘でした。それをCのようにしたくない場合は、別の戦略が必要ですが、リンクされたいくつかの質問に示されているように、reduceアクションのセマンティックチェックで行うのが最も簡単です。 (また、あなたはCのようにしたいと言ってはいけません:-)) – rici