2

flexを使用して、Cのようなリテラル文字に一致する正規表現を設定するのに問題があります。

構文に従って正しいリテラル文字と正しくない文字を一致させる必要があります。これには、終了していないcharリテラルがあります。

2つのルール。1つは正しいルール用、もう1つは未終了のルール用です。

chrlit          (\')([^\\\'\n]|(\\.))(\')
untermchrlit    (\')([\\|\']|(.))*

正規表現が必要なときに機能しないため、正規表現のサポートが必要です。これらがどのように機能するかについて、いくつかの例を示します。

'          -> unterminated char constant
'/'        -> CHRLIT('/')
'('        -> CHRLIT('(')
'a"b"c"de  -> unterminated char constant
'abc       -> unterminated char constant
'abc\      -> unterminated char constant
'\\'       -> CHRLIT('\\')
';'        -> CHRLIT(';')
''         -> unterminated char constant
'a'        -> CHRLIT('a')
'\'        -> unterminated char constant 
'\;'       -> CHRLIT('\;')
'\\\'      -> unterminated char constant
'\\\       -> unterminated char constant    
'\/'       -> CHRLIT('\/')
'a\'       -> unterminated char constant
'\\        -> unterminated char constant
'\t'       -> CHRLIT('\t')
4

1 に答える 1

4

問題は、文字リテラルが行末にない限り、終了していない文字リテラルのパターンが、終了文字とそれに続く文字にも一致することです。untermchrlit終了していない文字リテラルを正確に一致させようとするの'ではなく、このように生活をより簡単にすることができますchrlit。(したがって、chrlit可能なすべての終了リテラルに一致する場合は、終了していない必要があります。) (また、正規表現から余分な括弧とバックスラッシュをすべて削除する自由を取りました。これにより、読み取りのノイズが少し少なくなります。)

chrlit          '([^'\\\n]|\\.)'
untermchrlit    '

このソリューションの唯一の問題は、終了していない の直後にスキャンを続行することです。これにより、特に のよう'に実際に一致する があった場合に、人為的なエラーが発生する可能性が高くなります。ここで、2 回目以降もレキシカル スキャンを続行する必要があります (実際、おそらく、これを終了していない文字リテラルではなく、長すぎる文字リテラルとしてフラグを立てたいと思うでしょう)。そのような場合に対処するには、より洗練された一連のパターンが必要になります。可能性については次のとおりです。''too long''

/* As before */
chrlit          '([^'\\\n]|\\.)'
/* Also as before, a catch-all case. */
untermchrlit    '
/* Try to match single-quoted strings which are too short or too long */
emptychrlit     ''
/* The action for this regex *must* come after the action for chrlit */
longchrlit      '([^'\\\n]|\\.)+'

longchrlitここでも一致するすべてのものに一致することに注意してください。ただしchrlit、OP のパターンとは異なり、それ以上の文字には一致しません。正しいリテラルがchrlit. (ただし、順序を間違えた場合、flex は警告を発行する必要があります。)

Flex は常に最長一致に一致することに注意してください。ただし、複数のルールがまったく同じトークンに一致する場合、Flex は最初のアクションを選択します。

ところで、少なくとも C では、以下有効な文字リテラルです。

'a\
'

これ\は、直後に続く改行が入力から完全に削除されるため'ですa

于 2013-03-22T00:38:56.007 に答える