2010-11-27 16 views
0

Können sagen, Sie sind eine C++ wie Sprache zu schreiben und Sie Referenzen erlaubenbison: Wie löst man das Varname & Varname reduce/reduce Problem?

int& i 

Sie erlauben auch bitweise ands

7&5 

Wie lösen Sie reduzieren/Konflikte reduzieren? Ich meine nicht, den glr-Parser zu benutzen, aber habe keine Konflikte. Beispiel Syntax Problem ist

var&var //could be type& var or logical val & val 

Antwort

2

Sie zwischen der Sequenz von grammatischen Begriffen unterscheiden:

<type> & <identifier> 

und

<identifier> & <identifier> 

obwohl im letzteren Fall, Sie sind wahrscheinlich wirklich zu tun:

<expression> & <expression> 

oder ein ähnliches Konstrukt, bei dem '<expression>' als Literal-Integer oder einfache Variablennamen endet.

Dies kann eine semantische Rückmeldung an den lexikalischen Analysator erfordern - es muss erkennen können, dass int (im Beispiel) ein Typname (Schlüsselwort) und kein allgemeiner Bezeichner ist, aber es muss auch darüber informiert werden typedef-Namen, damit sie auch als Typen behandelt werden können. Beachten Sie jedoch, dass typedef-Namen im Allgemeinen auf Bereiche beschränkt sind.

+0

Ist es tatsächlich möglich, dem Lexer diese Art von Feedback zu geben? Ich war in der Lage, c wie #define zu implementieren und die Zustände beim Ein- und Auskommen eines Kommentars zu ändern, aber das sind flex-> flex und nicht bison-> flex –

+0

@ acidzombie24: Wenn Sie den lexikalischen Analysator entwerfen, um diese Art von Feedback zu akzeptieren, dann ja. –

+0

Sie sprechen also nicht über Flex? interessant –

0

Sie könnten flex sagen, um ein anderes Token für das Literal & je nachdem, was zuvor "lexed" wurde zurückgeben. So beenden Sie mit zwei Regeln auf:

<type> T_AMPERSAND <identifier> 

und

<expression> T_LOGIC_AND <expression> 

Wenn Ihre neue Sprache benutzerdefinierte Typen unterstützt, die Lexer nicht wissen, ob oder nicht war es nur ein <type> oder ein <identifier> gefunden, obwohl. In diesem Fall sollten Sie sicherstellen, dass <type> '&' <identifier> als eine gültige eigenständige Anweisung betrachtet wird, während <expression> '&' <expression> nur als rvalue (rechts neben einer Zuweisung) angezeigt werden kann.

Verwandte Themen